2009-10-26 6 views
6

J'étais sous l'impression que || et or étaient synonymes.Différence entre ou et || lors de la définition des variables

La variable de réglage or ne tient pas de valeur; Pourquoi?

>> test = nil or true 
=> true 
>> test 
=> nil 

>> test = false or true 
=> true 
>> test 
=> false 

Works 'comme prévu' avec ||

>> test = nil || true 
=> true 
>> test 
=> true 
+0

Cette habitude d'être un gotcha pour moi. –

Répondre

15

or a priorité inférieure que =.

test = nil or true 

est le même que

(test = nil) or true 

qui est true, tout en mettant en test-nil.

|| a une priorité supérieure à =.

test = nil || true 

est le même que

test = (nil || true) 

qui est true, tout en mettant à testtrue.

+1

... c'est pourquoi nous n'écririons pas un code comme celui-ci, ou si nous le faisions, nous utiliserions toujours des parenthèses pour clarifier ce qui se passe. – mpen

+0

Merci, c'est tout à fait logique. –

+2

Non seulement '||' a une précédence très haute et 'ou' une très faible, mais aussi' and' et 'or' ont la même priorité, alors que' || 'et' && 'ont des priorités différentes. En général, dans les expressions conditionnelles, utilisez toujours les formes d'opérateur, car elles ont les précédences relatives que vous attendez réellement d'elles. Utilisez 'and' et' or' uniquement pour le flux de contrôle, où vous voulez réellement que les expressions "inside" se lient plus étroitement. Quelque chose comme 'test = blah.get_records ou met 'No records found.''. –

1

Idem entre and et &&. J'ai été une fois mordu par ce gotcha, puis je me rends compte que, bien que and est plus lisible que &&, cela ne signifie pas toujours plus approprié.

>> f = true && false 
=> false 
>> f 
=> false 
>> f = true and false 
=> false 
>> f 
=> true 
>> 
Questions connexes