Me pregunto por qué rubí dar and
, or
menor precedencia que &&
, ||
, y asignar el operador? ¿Hay alguna razón?¿Hay alguna sabiduría detrás de "y", "o" operadores en Ruby?
Respuesta
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.
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.
hmm, eso explica por qué el rubí es tan inmaduro y al mismo tiempo está tan hinchado. Todavía es difícil entenderlo ... – akostadinov
Ellos tienen muy baja prioridad para que los operandos no tienen que ser envuelto entre paréntesis, como a veces ocurre con &&
y ||
.
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.
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.
- 1. Operadores y métodos en Ruby
- 2. Ruby - saltos de línea y los operadores
- 3. ¿Hay alguna forma de usar operadores implícitos C# de F #?
- 4. Operadores de comparación Ruby? == vs. ===
- 5. ¿Por qué no hay operadores || = o && = en C#?
- 6. pitón y/o operadores de valor
- 7. C# Operadores y legibilidad
- 8. ¿Hay alguna prueba para Ruby on Rails?
- 9. ¿Hay alguna explicación "simple" de qué procs y lambdas hay en Ruby?
- 10. ASP.NET: ¿código detrás o no código detrás?
- 11. ¿Hay alguna diferencia entre "! =" Y "<>" en Oracle Sql?
- 12. && = y = || operadores
- 13. ¿Hay alguna herramienta de informe o una gema en Ruby on Rails
- 14. ¿Hay alguna manera de obtener todas las variables en Ruby?
- 15. ¿Hay alguna diferencia entre DATE_SUB() y el uso de operadores aritméticos para el cálculo de fecha y hora?
- 16. Operadores lógicos ("y", "o") en el lote de DOS
- 17. ¿Qué operadores lógicos de C++ usa: y, o, no, y los operadores de estilo il o C? ¿por qué?
- 18. ¿Hay alguna manera de interceptar setters y getters en C#?
- 19. ¿Hay alguna razón específica detrás de usar $ con la variable en jQuery
- 20. ¿Hay alguna manera fácil de alternar "do/end" y "{}" en ruby en Vim?
- 21. + =, +, == y = operadores
- 22. con (nolock) o (nolock) - ¿Hay alguna diferencia?
- 23. ¿Hay alguna manera de imitar o en genéricos de Java
- 24. Java - compareTo y operadores
- 25. <? o <? php --- ¿hay alguna diferencia?
- 26. Variables mágicas $ prefijadas en Ruby; ¿hay alguna referencia completa en alguna parte?
- 27. ¿Hay alguna forma de hacer bitwise-O enumeraciones en Java?
- 28. En Ruby, ¿hay alguna forma de imprimir todas las variables globales y constantes definidas/predefinidas?
- 29. ¿Hay alguna forma de activar y desactivar el bluetooth y/o wifi mediante programación en iOS?
- 30. ¿hay alguna manera de usar tr /// (o equivalente) en java?
¿Hay un nombre para la expresión idiomática de do_something o morir? ¿Se usa en ruby? –
No conozco ningún nombre, pero es bastante común en Ruby. – Chuck
Perl se apoya fuertemente en morir, mientras que Ruby usa raise. La ventaja de una excepción es que puedes rescatarla. – tadman