2012-11-09 1 views
1

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 

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

+0

Cela peut aider: http://stackoverflow.com/questions/8908050/why-is-aa-nil-in-ruby – Baldrick

+0

Ce Dupliquons exact :) –

+0

@SergioTulentsev Je ne sais pas pourquoi tomber dans la même catégorie que – Viren

Répondre

0

Ok. Je pense que cela explique:

ccc = (ccc == nil) 
=> true 

Apparemment, chaque fois que vous attribuez quelque chose à une variable, rubis premier initialisée à zéro.

+0

Point accepté est-ce que cela a défini pourquoi le« si »fonctionne différemment dans le cas ci-dessus – Viren

+0

Un autre point est 'y = (défini? (Y)? Y: vrai)' donne le même résultat que décrit par moi ci-dessus c.-à-d. Que vous obtenez 'nil' – Viren

+0

vous avez raison. m'a eu là. – davidrac