2009-10-26 12 views
6

tenía la impresión de que || y eran sinónimos.Diferencia entre o y || al establecer variables

La variable de configuración con or no tiene valor; ¿por qué?

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

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

Works como se esperaba 'con ||

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

Esto solía ser un problema para mí. –

Respuesta

15

or tiene menor precedencia de =.

test = nil or true 

es la misma que

(test = nil) or true 

que es true, mientras que la creación test-nil.

|| tiene mayor prioridad que =.

test = nil || true 

es la misma que

test = (nil || true) 

que es true, mientras que la creación test a true.

+1

... por lo que no escribiríamos un código como este, o si lo hiciéramos, siempre usaríamos corchetes para dejar en claro lo que está sucediendo. – mpen

+0

Gracias, esto tiene perfecto sentido. –

+2

No solo '' || 'tiene una prioridad muy alta y' o', sino que 'and' y' or' tienen la * misma * precedencia, mientras que '||' y '&&' tienen diferentes precedencias. En general, en expresiones condicionales, siempre use los formularios del operador, porque tienen las precedencias relativas que usted realmente espera que tengan. Utilice 'y' y' o' solo para el flujo de control, donde realmente * desea * que las expresiones "internas" se vinculen más. Algo como 'test = blah.get_records o puts 'No records found.''. –

1

Lo mismo entre and y &&. Una vez fui mordido por este gotcha, luego me doy cuenta de que aunque and es más legible que &&, eso no significa que siempre sea más adecuado.

>> f = true && false 
=> false 
>> f 
=> false 
>> f = true and false 
=> false 
>> f 
=> true 
>> 
Cuestiones relacionadas