To jest klasyczny błąd Ruby. case
ma dwie metody wywoływania: jedną, w której przekazujesz coś do gałęzi na podstawie i jedną, w której nie.
Jeśli zrobić określić wyraz w oświadczeniu case
następnie wszystkie pozostałe warunki są oceniane i porównywane z ===
. W tym przypadku wartość org <= 1
jest niższa niż false
, a org === false
oczywiście nie jest prawdą. To samo dotyczy wszystkich innych przypadków, są one albo prawdziwe, albo fałszywe. Oznacza to, że żaden z nich nie pasuje.
Jeśli nie określisz wyrażenia, wówczas case
zachowuje się jak fantazyjne if
.
Przełącznik case org
na case
i działa. Można również przełączyć na zakresy:
val =
case org
when 0..1
'L'
when 2..3
'M'
else
'H'
end
Sposób oryginalny kod wykonywany jest tak, jakby były:
org = 4
if (org <= 1) === org
val = 'L'
elsif (2..3) === org
val = 'M'
elsif (org >= 4) === org
val = 'H'
end
co nie jest to, co chcesz.
Dziękuję człowieku, działa !!!!! jeśli będziesz taki miły - włóż mój nos do dokumentacji, która wyjaśni mi to. –
@ S.ork Od [the docs] (http://ruby-doc.org/docs/keywords/1.9/Object.html#method-i-case): "Pierwszy klauzulę when, aby dopasować warunek (lub ocena do Boolowskiej prawdy, jeśli warunek jest zerowy) "wygrywa", a jej sekcja kodu jest wykonywana " –
@AndrewPiliser to nie pomaga, w moim przypadku tylko trzecia klauzula jest oceniana na true, ale nigdy nie jest wykonywana. –