2011-01-09 21 views

risposta

25

Il nome dell'operatore è la null-coalescing operator. Il post del blog originale che ho collegato a questo ha riguardato le differenze di coalizione nullo tra le lingue. Un nuovo confronto tra C# e Ruby null coalescing può essere trovato here.

In breve, è possibile utilizzare ||, come in:

a_or_b = (a || b) 
+0

Il link è ora morto. – orourkedd

+0

@orourkedd Grazie, l'ho rielaborato un po 'con un nuovo link. –

+2

Questo è in realtà un "operatore che genera falsi". – Kelvin

12

Se non ti dispiace coalescenza falso, è possibile utilizzare il || operatore:

a = b || c 

Se falso può essere un valore valido, si può fare:

a = b.nil? ? c : b 

dove B è controllato per nullo, e se lo è, a viene assegnato il valore di c, e se non B.

+0

Ho provato 'a = b o c; mette a '. Sorpresa, sorpresa, nel mio rubino 1.8.6, stampa il valore di b.Il motivo è che 'o' ha precedenza inferiore rispetto a' = ' – Shuo

+0

' o' non è un operatore booleano ma un operatore di controllo flusso in ruby: http://devblog.avdi.org/2010/08/02/using-and -e-o-in-ruby/ – orourkedd

+0

Sfortunatamente il secondo snippet potrebbe avere effetti collaterali se 'b' è un metodo (cioè viene chiamato due volte). – Kelvin

3

Tenere presente che Ruby dispone di funzionalità specifiche per la solita null coalescenza a [] o 0 o 0.0.

Invece di

x = y || [] # or... 
x = y || 0 

... è possibile (perché NilClass li implementa) basta fare ...

x = y.to_a # => [] or .. 
x = y.to_i # or .to_f, => 0 

Questo rende alcuni modelli di progettazione comuni come:

(x || []).each do |y| 

... un po 'più bello:

x.to_a.each do |y| 
+1

Spesso lo vedrai anche come '[* x] .each do | y |'. –