Pregunta ¿Hay alguna sabiduría detrás de "y", "o" operadores en Ruby?


Me pregunto por qué el rubí da and, or menos prioridad que &&, || y asignar operador? ¿Hay alguna razón?


10
2017-09-16 18:57


origen


Respuestas:


Supongo que es un arrastre directo de Perl. Los operadores or y and se agregaron más tarde en Perl 5 para situaciones específicas donde se deseaba una precedencia más baja.

Por ejemplo, en Perl, aquí deseamos que || tenía menor precedencia, para que pudiéramos escribir:

try to perform big long hairy complicated action     || die ;

y asegúrese de que || no iba a engullir parte de la acción. Perl 5 introducido or, una nueva versión de || que tiene baja precedencia, exactamente para este propósito.

Un ejemplo en Ruby donde podrías usar or pero no ||:

value = possibly_false or raise "foo"

Si usaste ||, sería un error de sintaxis


15
2017-09-16 20:32



La diferencia es la precedencia. ||, && tener mayor prioridad que =, pero and, or tener más bajo. Entonces, mientras puedes hacer:

a = nil || 0

Tendría que hacer:

a = (nil or 0)

para obtener el mismo efecto. Si lo haces:

a = nil or 0

El resultado de expresión aún sería 0, pero un valor sería nulo.


8
2017-09-17 09:56



Tienen una precedencia muy baja para que los operandos no tengan que estar entre paréntesis, como ocurre a veces con && y ||.


5
2017-09-16 19:00



Ser capaz de controlar la precedencia de sus operadores a veces es útil, especialmente si le preocupa la legibilidad: los paréntesis adicionales en las declaraciones condicionales a veces pueden oscurecer la lógica real.

Sin embargo, para ser sincero, creo que la razón por la que Ruby tiene los niveles de precedencia del operador booleano proviene principalmente del hecho de que Matz fue programador de Perl antes de escribir Ruby, y tomó prestada gran parte de la sintaxis del núcleo y operadores de ese idioma.


4
2017-09-16 19:00



Creo que la idea es específicamente ponerlos debajo de los operadores de asignación, para que pueda escribir pruebas lógicas con asignaciones pero sin paréntesis.


2
2017-09-16 20:02