Il y a eu une chose bizarre que j'ai rencontrée ce matin dans Ruby, concernant l'opérateur ternaire. Voici comment ça se passe:défini? Bizarre
x = nil ? x : true
Comme on le sait tous, x
est réglé sur vrai, pas surprise là. Maintenant, subsequentlyl fonctionnement:
defined?(y)
=> nil
Cette réponse impliquerait y
n'a pas encore été défini. Cependant:
defined?(y) ? y : true
retours vrai. Pas de surprise à nouveau. La surprise vient ici:
y = defined?(y) ? y : true
et ce qui se passe? y
est défini sur nil
!
Mais attendez, il y a plus. Or, puisque y
est affecté, nous allons travailler avec z
:
defined?(z)
#=> nil
Impliquant z
est pas encore défini.
z = defined?(z) ? false : true
Et la suprise: z
est réglé sur faux. Je n'ai aucune idée de comment cela se passe. Faire de même dans un bloc if
donne le même résultat.
z1 = if defined?(z1) then z1 else true end
Encore une fois z1
est réglé sur nil
.
z2 = if defined?(z2) then false else true end
Cela aussi, me donne une surprise, comme z2
est réglé sur false
. Maintenant, je supposais que l'expression ci-dessus pour se comporter quelque chose comme:
z3 = if nil then false else true end
où z3
est attribué, à true
, compte tenu du fait que defined?
retourné nil
dans tous les cas ci-dessus. Cela me fait croire qu'il y a quelque chose de spécial au travail autour de l'appel defined?
, mais je n'ai pu trouver aucune information à ce sujet dans la documentation de Ruby.
Btw. J'ai testé ce qui précède sur rubis 1.8.7 et 1.9.2
Cela peut aider: http://stackoverflow.com/questions/8908050/why-is-aa-nil-in-ruby – Baldrick
Ce Dupliquons exact :) –
@SergioTulentsev Je ne sais pas pourquoi tomber dans la même catégorie que – Viren