2010-05-14 4 views
0

print (-1 == -1) et (myobj.nil?)Pourquoi est-ce que je vois des résultats différents pour deux expressions dans Ruby, on utilise '&&', d'autres utilisations 'et' opérateur?

vrai

print (-1 == -1) & & (myobj.nil?)

false

Remarque, myobj.nil? renvoie false donc, cela ne devrait pas toujours être faux.

+2

Bienvenue sur StackOverflow! À l'avenir, veuillez rechercher les questions existantes avant de poser la vôtre. Les chances sont, il a déjà été demandé, et, plus important encore, une réponse. De cette façon, nous évitons la duplication et gardons toutes les réponses parfaitement ensemble au même endroit. Copies possibles: http://StackOverflow.Com/questions/2083112/, http://StackOverflow.Com/questions/1625946/, http://StackOverflow.Com/questions/1426826/, http://StackOverflow.Com/ questions/1840488 /, http://StackOverflow.Com/questions/1434842/, http://StackOverflow.Com/questions/2376369/. –

+0

@ Jörg: Rechercher "and" et "&&" dans Stack Overflow ne fonctionne pas, et l'entrée du titre de la question dans "Ask Question" n'a pas révélé de doublons. Les habitués de débordement de pile devraient savoir que des questions connexes existent, cependant. –

Répondre

1

Parce qu'ils ont une priorité d'opérateur différente.

La première est évaluée comme:

(print (-1 == -1)) and (myobj.nil?) 

Il imprime vrai, parce que -1 == -1, puis imprimer renvoie nil et nil and false est nul.

Le second est équivalent à:

print ((-1 == -1) && (myobj.nil?)) 

Il imprime (true & & false), ce qui est faux, puis imprimez le rendement nul.

+0

mais pourquoi est-ce important dans ce cas, -1 == - 1 est toujours vrai, et myobj.nil? évalue à faux. donc le résultat net devrait toujours être faux. – Shekhar

+0

oh ok, donc si elle était utilisée en expression conditionnelle comme si (-1 == -1) et (myobj.nil?) les deux, auraient le même résultat? – Shekhar

+3

@Shekhar: La valeur de retour de 'print' est' nil', au moins dans Ruby 1.8. Par conséquent, la première expression réduit comme ceci: '(print (-1 == -1)) et myobj.nil? '' '' (true) et myobj.nil? '→' nil et myobj.nil? '(avec l'effet secondaire de l'impression ** true **) →' nil', alors que la seconde expression réduit comme ceci : 'print ((-1 == -1) && myobj.nil?)' → 'print (vrai && myobj.nil?)' → 'imprimer myobj.nil?' → 'imprimer false' →' nil' (avec l'effet secondaire de l'impression ** false **). –

3

&& et and ont des priorités différentes. En particulier, and a une très faible priorité, inférieure à presque toute autre chose.

La valeur de retour de print est nil, au moins dans Ruby 1.8. Par conséquent, la première expression se réduit à ceci:

(print (-1 == -1)) and myobj.nil? 
(print true) and myobj.nil? # => with the side-effect of printing "true" 
     nil   and myobj.nil? 
     nil 

Alors que la seconde expression se réduit à ceci:

print ((-1 == -1) && myobj.nil?) 
print ( true && myobj.nil?) 
print    myobj.nil? 
print     false  # => with the side-effect of printing "false" 
      nil 
Questions connexes