C # ?? operatore in Ruby?
-
11-09-2019 - |
Domanda
E 'possibile implementare il ?? operatore in Ruby?
a = nil
b = 1
x = a ?? b # x should == 1
x = b ?? 2 # x should == 1
Soluzione
Siete alla ricerca di assegnazione condizionale:
a ||= b # Assign if a isn't already set
e il || operatore
a = b || 2 # Assign if b is assigned, or assign 2
Altri suggerimenti
In Ruby, gli operatori booleani corto circuito (||
, &&
, and
e or
) non ritornano true
o false
, ma piuttosto il primo operando che determina il risultato della intera espressione. Questo funziona, perché Ruby ha una piuttosto semplice idea di verità. O meglio, ha una piuttosto semplice idea di menzogna: nil
è falso, e ovviamente false
è falso. Tutto il resto è vero.
Quindi, dal momento ||
è vero quando almeno un dei suoi operandi è vero, e gli operandi vengono valutati da sinistra a destra, questo significa che a || b
ritorna a
, quando a
è vero. Ma quando a
è falso, allora il risultato dell'espressione è dipendente unicamente dalla b
, e quindi b
viene restituito.
Ciò significa che, a causa nil
è falso, si può semplicemente utilizzare ||
invece di ??
per gli esempi che hai dato. (C'è anche l'operatore a ||= b
ingegnoso, che tipo di opere come a || a = b
, ma non del tutto.)
Tuttavia, che solo funziona, perché non si utilizza Booleans nei tuoi esempi. Se si prevede di trattare con valori booleani, che non funziona:
b = false
x = b || 2 # x should be == false, but will be 2
In questo caso, si dovrà usare #nil?
, e un'espressione condizionale:
b = false
x = unless b.nil? then b else 2 end # x should be == 2
o utilizzando l'operatore condizionale ternario:
b = false
x = b.nil? ? 2 : b # x should be == false
Se si vuole, si può avvolgere che in un metodo piacevole:
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
Questo frammento carina portato a voi da polimorfismo, lezioni aperte e il fatto che nil
è in realtà un oggetto che rappresenta il nulla (a differenza, ad esempio, Java, dove null
è in realtà niente).
x = b || 2
(??
in C #) si chiama l'operatore si fondono.
Non è il fondono gemma, che è il più vicino si arriva.
nil || 5 # => 5
false || 5 # => 5 :(
false._? 5 # => false :)