Comment Je ne cherche pas simplement un exemple en utilisant nil code> est-il manifeste dans le code? Par exemple, dans Python, vous ne pouvez utiliser aucun pour un argument par défaut lorsqu'il fait référence à un autre argument, mais dans Ruby, vous pouvez vous référer à d'autres arguments de la liste des arguments (voir cette question ). Dans JS,
indéfini code> apparaît encore plus parce que vous ne pouvez pas spécifier des arguments par défaut du tout. Pouvez-vous donner un exemple de comment
rubynone code> apparaît et comment il est traité? P>
nil code>. De préférence, il s'agirait d'un vrai coup de code qui devait utiliser
nil code> pour une raison quelconque ou une autre. P>
5 Réponses :
Mon ruby-fu est très faible, mais nil code> pourrait être ce que vous recherchez. Voici une illustration rapide d'utiliser
nil code> dans une fonction comme argument par défaut.
irb(main):003:0> def foo(a = nil)
irb(main):004:1> puts a
irb(main):005:1> end
=> nil
irb(main):006:0> foo(1)
1
=> nil
irb(main):007:0> foo()
nil
=> nil
irb(main):008:0>
Ne soyez pas confus par le => nil code> dans la sortie là-bas: c'est IRB montrant la valeur de retour de la méthode code> FOO code>.
ruby's Nil et Python's Accéder aux tableaux et hachages: P> Aucun sont équivalents dans le sens où ils représentent l'absence d'une valeur. Cependant, les personnes venant de Python peuvent trouver un comportement surprenant. Premièrement, Ruby retourne
nil code> dans les situations Python élève une exception:
nil.to_i # 0
nil.to_f # 0.0 # But Integer(nil) or Float(nil) raise a TypeError.
nil.to_s # ""
Qu'est-ce que le @ code> signifie dans l'exemple de variable d'instance?
Les noms de variable d'instance commencent par @ code>, variables de classe avec
@@ code>.
@x est équivalent à Self.x en python (bien que les motifs de l'OOP dans Ruby et Python soient très différents).
Si vous faites [1, 2, 3] .fetch (999) code> au lieu de cela, vous obtiendrez une exception. Si vous avez des avertissements, vous obtiendrez un avertissement sur
myclass.new.hello code>. Si vous faites
entier (nil) code> ou
float (nil) code>, vous obtiendrez
typeError code> s.
chaîne (nil) code> vous donne une chaîne vide, cependant. Aussi, voulez-vous dire "permissive" (permettant beaucoup de choses), pas "promiscuous" (avoir des relations sexuelles ou des interactions avec beaucoup de choses)?
@Andrew: Je vais incorporer vos notes à la réponse, merci. Je pensais que "promiscous" pourrait être utilisé métaphoriquement ... je vais le changer.
@tokland: il peut être utilisé métaphoriquement: promiscuous_ (Disambimuation) , c'est pourquoi Je mets "ou interactions" dans mon commentaire.
Une utilisation de Ceci fonctionne car une fois une variable vue sur le côté gauche de la gauche de Une mission, il a implicitement la valeur nul. p> ainsi lorsque le vous pouvez écrire p> Ceci traduit fondamentalement à la finition en plus de ce Je ne suis pas trop versé en python, mais de ce que j'ai vu nil code> que vous voyez souvent dans le code Ruby est la suivante:
a || 10 code> pièce est évalué, il évalue à
nil || 10 code>, qui donne 10. p>
nil code> et
false code> sont aussi les seules deux valeurs de Ruby qui sont logiquement fausses, il est donc d'usage habituel Pour les méthodes de retour
nil code> en cas de défaillance. Il y a un joyau appelé
andand code> qui utilise exactement cela, donc plutôt que quelque chose comme p>
@first_name code> s'il a une valeur autre que
nil code>, sinon évaluer à
nil code>. Comme vous pouvez l'imaginer, cela est particulièrement utile lorsque des méthodes de chaînage où l'un des intermédiaires peut potentiellement retourner
nil code>. P>
nil code> est également retourné lorsque vous tentent d'accéder aux éléments de collecte non existants, par exemple dans le cas de tableaux ou de hachages. Les variables d'instance non initialisées ont également la valeur
nil code>. P>
nil code> et
Aucun code> servir à peu près le même objectif. p> p>
Maintenant que "And" apparaît, je dois recommander le projet ICK (même auteur) et c'est "peut-être" motif, vraiment sympa! this_may_be_nil_or_a_string.maybe.strip # chaîne dénudé ou nil
andand code> et
peut-être code> me rappelle le
peut-être code> monad à haskell.
@Claudiu: ne pas être confondu avec le mot-clé Mebbe Code> en lolcode.
Ils sont également utilisés à la place de void code>: dans une langue statique, le compilateur vous interdire simplement de l'utilisation de la valeur de retour d'un
Void code> fonction, mais dans un Langue dynamique Chaque procédure doit revenir quelque chose em>. Donc la valeur spéciale
nil code> est utilisée. P>
Il est possible d'avoir une langue dynamique qui viennerait une exception si vous essayez d'utiliser le résultat d'une fonction qui n'a rien renvoyé. Je ne pense pas que ça ne le pense pas.
En plus de toutes les explications sur NIL, Ruby a également "défini?".
a = nil p defined?(a) #=> "local-variable" p a.nil? #=> true p defined?(b) #=> nil
@delnan: C'est celui qui est celui. Je cherche plus pour un cas d'utilisation que le nom de la variable à Ruby, alors j'ai modifié la question de refléter que