2011-01-09 23 views

Respuesta

25

El nombre del operador es el null-coalescing operator. La publicación original del blog a la que vinculé cubrió las diferencias en la unión nula entre idiomas se ha eliminado. Se puede encontrar una comparación más reciente entre C# y Ruby null coalescing here.

En resumen, se puede utilizar ||, como en:

a_or_b = (a || b) 
+0

El enlace está ahora muerto. – orourkedd

+0

@orourkedd Gracias, lo he modificado un poco con un nuevo enlace. –

+2

Esto es en realidad un "operador de falsa coalescencia". – Kelvin

12

Si no le importa coalescencia falsa, puede utilizar el || operador:

a = b || c 

Si es falso puede ser un valor válido, que puede hacer:

a = b.nil? ? c : b 

donde se comprueba b para nulo, y si lo es, una se le asigna el valor de c, y si No es b.

+0

Intenté 'a = b o c; pone un '. Sorpresa, sorpresa, en mi rubí 1.8.6, imprime el valor de b.La razón es que 'o' tiene precedencia menor que' = ' – Shuo

+0

' or' no es un operador booleano sino un operador de flujo de control en ruby: http://devblog.avdi.org/2010/08/02/using-and -and-or-in-ruby/ – orourkedd

+0

Lamentablemente, el segundo fragmento podría tener efectos secundarios si 'b' es un método (es decir, se llama dos veces). – Kelvin

3

Tenga en cuenta que Ruby tiene características específicas para la coalescencia nula habitual a [] o 0 o 0.0.

En lugar de

x = y || [] # or... 
x = y || 0 

... se puede (porque NilClass las implementa) acaba de hacer ...

x = y.to_a # => [] or .. 
x = y.to_i # or .to_f, => 0 

Esto hace que ciertos patrones de diseño comunes como:

(x || []).each do |y| 

... se ve un poco mejor:

x.to_a.each do |y| 
+1

También a menudo verá eso como '[* x] .each do | y |'. –