¿C#? ¿operadora de Ruby?
¿Es posible implementar el ?? ¿operadora de Ruby?
a = nil
b = 1
x = a ?? b # x should == 1
x = b ?? 2 # x should == 1
4 answers
Estás buscando una asignación condicional:
a ||= b # Assign if a isn't already set
Y el operador | |
a = b || 2 # Assign if b is assigned, or assign 2
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-04 21:34:36
En Ruby, los operadores booleanos de cortocircuito(||
, &&
, and
y or
) no devuelven true
o false
, sino el primer operando que determina el resultado de toda la expresión. Esto funciona, porque Ruby tiene una idea bastante simple de la verdad. O más bien, tiene una idea bastante simple de falsedad: nil
es falsa, y obviamente false
es falsa. Todo lo demás es verdad.
Entonces, puesto que ||
es verdadero cuando al menos uno de sus operandos es verdadero, y los operandos se evalúan de izquierda a derecha, esto significa que a || b
devuelve a
, {cuando[14]} es cierto. Pero cuando a
es false, entonces el resultado de la expresión depende únicamente de b
, y así se devuelve b
.
Eso significa que, debido a que nil
es falso, puedes usar ||
en lugar de ??
para los ejemplos que diste. (También está el operador nifty a ||= b
, que funciona como a || a = b
, pero no del todo.)
Sin embargo, eso solo funciona, porque no usas booleanos en tus ejemplos. Si espera tratar con valores booleanos, eso no funcionará:
b = false
x = b || 2 # x should be == false, but will be 2
En ese caso, tendrá que usar #nil?
, y una expresión condicional:
b = false
x = unless b.nil? then b else 2 end # x should be == 2
O usando el operador condicional ternario:
b = false
x = b.nil? ? 2 : b # x should be == false
Si lo desea, puede envolverlo en un buen método:
class Object
def _? b = nil
return self
end
end
class NilClass
def _? b = nil
return yield if block_given?
return b
end
end
b = false
x = b._? { 2 } # x should be == false
x = b._? 2 # x should be == false
Este lindo fragmento traído a usted por polimorfismo, clases abiertas y el hecho de que nil
es en realidad un objeto que representa nothingness (a diferencia de, digamos, Java, donde null
es realmente nada).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-04 22:08:32
x = b || 2
It (??
en C#) se llama el operador coalesce.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-05 09:26:44
Está la gema coalesce, que es lo más cerca que puedes estar.
nil || 5 # => 5
false || 5 # => 5 :(
false._? 5 # => false :)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-12 00:58:46