Что делает case .. when
, так это вызывает метод ===
для ваших when
значений, передавая объект foo
в качестве аргумента методу ===
.Итак, в этом коде:
case foo
when 1 then "something"
when 2 then "something else"
when 3 then "another thing"
end
Он будет пытаться 1 === foo
, затем 2 === foo
, затем 3 === foo
, пока один из них не вернет истинное значение.
Один из способов сделатьcase .. when
более мощный использует Procs в качестве значений when
.Я не уверен насчет более ранних версий Ruby, но в 1.9 proc === x
эквивалентен proc.call(x)
.Поэтому вы можете написать код, подобный следующему:
case foo
when Proc.new { foo.bar == 1 } then "something"
when Proc.new { foo.bar == 2 } then "something else"
when Proc.new { foo.baz == 3 } then "another thing"
end
Обратите внимание, что нам даже не нужно передавать foo
в Procs, так как у нас уже есть доступ к нему.Я не думаю, что это очень хороший выбор структуры управления для этого примера, простейшая цепочка ifs имела бы больше смысла:
if foo.bar == 1
"something"
elsif foo.bar == 2
"something else"
elsif foo.baz == 3
"another thing"
end