2011-01-09 12 views

Odpowiedz

25

Nazwa operatora jest null-coalescing operator. Pierwotny wpis na blogu, który powiązałem z tym, obejmował różnice w zerowym łączeniu języków, został usunięty. Nowsze porównanie koalescencji C# i Ruby null można znaleźć here.

W skrócie, można użyć ||, jak w:

a_or_b = (a || b) 
+0

Link jest teraz martwy. – orourkedd

+0

@orourkedd Dzięki, przerobiłem go trochę z nowym łączem. –

+2

Jest to właściwie "operator koalescencji". – Kelvin

12

Jeśli nie przeszkadza koalescencyjny fałszywe, można użyć || Operator:

a = b || c 

Jeśli fałszywa może być poprawną wartość, można to zrobić:

a = b.nil? ? c : b 

gdzie b jest zaznaczone na zero, a jeśli tak jest, a zostaje przypisana wartość C, a jeśli nie b.

+0

Próbowałem "a = b lub c; stawia a'. Niespodzianka, niespodzianka, w moim ruby ​​1.8.6, drukuje wartość b.Powód jest taki, że 'lub' ma niższy priorytet niż '=' – Shuo

+0

'lub' nie jest operatorem boolowskim, ale operatorem przepływu sterowania w ruby: http://devblog.avdi.org/2010/08/02/using-and i-in-ruby/ – orourkedd

+0

Niestety, drugi fragment może wywołać efekty uboczne, jeśli "b" jest metodą (tzn. jest wywoływana dwa razy). – Kelvin

3

Należy pamiętać, że Ruby ma specyficzne cechy dla zwykłej zerowej koalescencji z [] lub 0 lub 0.0.

Zamiast

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

... można (bo NilClass wdraża je) po prostu zrobić ...

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

To sprawia, że ​​pewne wzorce projektowe, takie jak wspólna:

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

... wyglądają nieco ładniej:

x.to_a.each do |y| 
+1

Często będziesz także widział, że jako "[* x] .each do | y |". –