2011-11-11 6 views
5

Duplicar posible:
Difference between “and” and && in Ruby?
Ruby: difference between || and 'or'Ruby's 'o' vs '||'

que tenía el código (algo así)

foo = nil or 4 

donde quería foo a ser el primer valor (podría ser nil), o un valor predeterminado 4. Cuando probado en IRB, la salida fue lo que esperaba que fuera. Tonto, no revisé el valor de foo más tarde. Después de un tiempo, empecé a notar algunos errores en mi código, y no encontré el problema hasta que comprobé el valor de foo en irb, que fue, oh sorpresa, nil en lugar de lo esperado 4.

¿Cuál es la historia sobre or vs ||? ¿Se supone que deben funcionar como reemplazos? ¿Hay algunas advertencias sobre el uso de or en lugar de ||?

+0

Aunque estoy de acuerdo en que las preguntas están directamente relacionados, y tienen una respuesta casi idéntica, no son la misma pregunta. Si el primero fue expandido para comparar 'o' vs' || 'así como' y' contra '&&', estaría de acuerdo en que eran duplicados. – zzzzBov

+0

También vea http://stackoverflow.com/questions/1434842/is-here-any-wisdom-behind-and-or-operators-in-ruby, http://stackoverflow.com/questions/3904888/why-and -o-se comporta-diferentemente-en-rieles, & c. – jball

Respuesta

12

El problema aquí es la precedencia. or tiene menor prioridad que ||. Por lo tanto, su primera declaración se evalúa como

(x = nil) or 4 

El resultado de la expresión es 4 (razón por la cual se pensaba que estaba funcionando correctamente en irb), pero x está asignado nil porque or tiene menor precedencia que hace = .

La versión || hace lo que quiere:

x = (nil || 4) 
2

or tiene (muy) menor prioridad.

4

or tiene menor precedencia que tanto || y = - que significa asignación se ejecuta antes de or. Mientras que || tiene una precedencia mayor que = y se ejecuta primero.

Cuestiones relacionadas