Domanda

E 'possibile implementare il ?? operatore in Ruby?

a = nil
b = 1

x = a ?? b # x should == 1
x = b ?? 2 # x should == 1
È stato utile?

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 :)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top