C # ?? operador en ruby?

¿Es posible implementar el ?? operador en ruby?

a = nil b = 1 x = a ?? b # x should == 1 x = b ?? 2 # x should == 1 

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 

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 falso, y obviamente false es falso. Todo lo demás es verdad.

Entonces, desde || es cierto cuando al menos uno de sus operandos es verdadero, y los operandos se evalúan de izquierda a derecha, esto significa que a || b a || b devuelve a , cuando a es verdadero. Pero cuando a es falso, entonces el resultado de la expresión depende únicamente de b , y por lo tanto b se devuelve.

Eso significa que, porque nil es falso, puedes usar || en lugar de ?? por los ejemplos que diste. (También está el ingenioso a ||= b operador, que funciona como a || a = b , pero no del todo).

Sin embargo, eso solo funciona, porque no usas Booleans 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, deberás usar #nil? , y una expresión condicional:

 b = false x = unless b.nil? then b else 2 end # x should be == 2 

o utilizando el operador condicional ternario:

 b = false x = b.nil? ? 2 : b # x should be == false 

Si lo desea, puede envolver eso 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 de código provisto por el polymorphism, las clases abiertas y el hecho de que nil es en realidad un objeto que representa la nada (a diferencia de, digamos, Java, donde null es en realidad nada).

 x = b || 2 

Se llama ( ?? En C #) el operador de coalescencia.

Ahí está la gem coalesce , que es lo más cerca que tendrás.

 nil || 5 # => 5 false || 5 # => 5 :( false._? 5 # => false :) 
Intereting Posts