case
оператор делает возвращает значение, вы просто должны использовать правильную форму его чтобы получить ценность, которую вы ожидаете.
В Ruby есть две формы: case
. Первый из них выглядит следующим образом:
case expr
when expr1 then ...
when expr2 then ...
else ...
end
Это будет сравнить expr
с when
выражения, используя ===
(это тройка BTW), и он будет выполнять первый then
где ===
дает истинное значение. Например:
case obj
when Array then do_array_things_to(obj)
when Hash then do_hash_things_to(obj)
else raise 'nonsense!'
end
такая же, как:
if(Array === obj)
do_array_things_to(obj)
elsif(Hash === obj)
do_hash_things_to(obj)
else
raise 'nonsense!'
end
Другая форма case
это просто набор логических условий:
case
when expr1 then ...
when expr2 then ...
else ...
end
Например:
case
when guess > @answer then :high
when guess < @answer then :low
else :correct
end
- это то же самое s:
if(guess > @answer)
:high
elsif(guess < @answer)
:low
else
:correct
end
Вы используете первую форму, когда вы думаете, что вы используете вторую форму, так что вы в конечном итоге делает странные (но синтаксически действительные) вещи, как:
(guess > @answer) === guess
(guess < @answer) === guess
В любом случае, , case
- это выражение и возвращает все возвращенные ответвления.
Просто для удовольствия , вы также можете сказать '{-1 =>: low, 0 =>: correct, 1 =>: high} [guess <=> @answer]'. –
Это выглядит как безумие. Я попробую это скоро. Благодарю. – dwilbank
Да, я не рекомендую вам делать это в реальной жизни, поэтому я не включил его в свой ответ. –