¿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
Author: Chris Pitman, 2009-06-05

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
 33
Author: jonnii,
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).

 47
Author: Jörg W Mittag,
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.

 5
Author: ChristopheD,
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 :)
 1
Author: Skofo,
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