2009-09-16 11 views

Respuesta

15

Mi conjetura es que es un remanente directo desde Perl. Los operadores or y and se agregaron más adelante en Perl 5 para situaciones específicas donde se deseaba una precedencia más baja.

Por ejemplo, en Perl, aquí nos gustaría que || tenían precedencia más baja, por lo que podemos escribir:

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

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

Un ejemplo en Ruby donde se podía utilizar or pero no ||:

value = possibly_false or raise "foo" 

Si utilizó ||, sería un error de sintaxis.

+0

¿Hay un nombre para la expresión idiomática de do_something o morir? ¿Se usa en ruby? –

+0

No conozco ningún nombre, pero es bastante común en Ruby. – Chuck

+0

Perl se apoya fuertemente en morir, mientras que Ruby usa raise. La ventaja de una excepción es que puedes rescatarla. – tadman

4

Ser capaz de controlar la precedencia de los operadores es a veces útil, especialmente si usted está preocupado con la legibilidad - paréntesis extra en las sentencias condicionales a veces puede oscurecer la lógica real.

Para ser sincero, creo que la razón por la que Ruby tiene los niveles de precedencia del operador booleano se debe principalmente al hecho de que Matz fue programador de Perl antes de escribir Ruby, y tomó prestada gran parte de la sintaxis y operadores básicos de ese idioma.

+0

hmm, eso explica por qué el rubí es tan inmaduro y al mismo tiempo está tan hinchado. Todavía es difícil entenderlo ... – akostadinov

5

Ellos tienen muy baja prioridad para que los operandos no tienen que ser envuelto entre paréntesis, como a veces ocurre con && y ||.

2

creo que la idea es específicamente para obtenerlos por debajo de los operadores de asignación, para que pueda escribir pruebas lógicas con las tareas pero sin parens.

7

La diferencia es la precedencia. ||, && tienen mayor precedencia que =, pero and, or tener menor. Así, mientras que puede hacer:

a = nil || 0 

Usted tendría que hacer:

a = (nil or 0) 

para conseguir mismo efecto. Si lo hace:

a = nil or 0 

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

Cuestiones relacionadas