6
votes

Cas d'utilisation Ruby pour NIL, équivalent à Python Aucun ou JavaScript non défini

Comment nil 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 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 apparaît et comment il est traité?

Je ne cherche pas simplement un exemple en utilisant nil . De préférence, il s'agirait d'un vrai coup de code qui devait utiliser nil pour une raison quelconque ou une autre.


1 commentaires

@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


5 Réponses :


0
votes

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> 


1 commentaires

Ne soyez pas confus par le => nil dans la sortie là-bas: c'est IRB montrant la valeur de retour de la méthode FOO .



9
votes

ruby's Nil et Python's 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:

Accéder aux tableaux et hachages: P>

nil.to_i # 0
nil.to_f # 0.0 # But Integer(nil) or Float(nil) raise a TypeError.
nil.to_s # ""


6 commentaires

Qu'est-ce que le @ signifie dans l'exemple de variable d'instance?


Les noms de variable d'instance commencent par @ , variables de classe avec @@ .


@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) au lieu de cela, vous obtiendrez une exception. Si vous avez des avertissements, vous obtiendrez un avertissement sur myclass.new.hello . Si vous faites entier (nil) ou float (nil) , vous obtiendrez typeError s. chaîne (nil) 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.



2
votes

Une utilisation de nil que vous voyez souvent dans le code Ruby est la suivante: xxx

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. xxx

ainsi lorsque le a || 10 pièce est évalué, il évalue à nil || 10 , qui donne 10.

nil et false 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 en cas de défaillance. Il y a un joyau appelé andand qui utilise exactement cela, donc plutôt que quelque chose comme xxx

vous pouvez écrire xxx

Ceci traduit fondamentalement à la finition @first_name s'il a une valeur autre que nil , sinon évaluer à nil . 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 .

en plus de ce nil 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 .

Je ne suis pas trop versé en python, mais de ce que j'ai vu nil et Aucun servir à peu près le même objectif.


3 commentaires

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 et peut-être me rappelle le peut-être monad à haskell.


@Claudiu: ne pas être confondu avec le mot-clé Mebbe en lolcode.



0
votes

Ils sont également utilisés à la place de void : dans une langue statique, le compilateur vous interdire simplement de l'utilisation de la valeur de retour d'un Void fonction, mais dans un Langue dynamique Chaque procédure doit revenir quelque chose . Donc la valeur spéciale nil est utilisée.


1 commentaires

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.



2
votes

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


0 commentaires