when
использует оператор ===
для сравнения значения, заданного для case
, с аргументом, заданным для when
. Кроме того, then
не требуется при появлении в строке, отличной от оператора when
. Правильный код для того, что вы пытаетесь сделать:
case x
when 16
puts 'hi'
when Object
puts 'obj'
end
Что касается нового дополнения к вопросу:
case user.roles.included? (... magic ...)
when ['admin', 'editor']
...
when ['anonymous']
...
end
Это не работает, потому что ===
массива не сопоставляется с include
. Я не уверен, откуда взялся оператор Array ===
или даже что он делает, но вы можете переопределить его, чтобы обеспечить желаемую функциональность.
Судя по приведенному выше коду, вы хотите, чтобы case
срабатывал, если одна из ролей пользователя соответствует массиву. Это переопределит Array#===
для этого:
class Array
def === other_array
! (other_array & self).empty?
end
end
case user.roles
when ['admin', 'editor']
...
when ['anonymous']
...
end
Предупреждение: В зависимости от того, где вы переопределите Array#===
, это может привести к непредвиденным последствиям, поскольку изменит все массивы в этой области. Учитывая, что ===
наследуется от Object, где он является псевдонимом для ==
, я не ожидаю, что это будет большой проблемой.
Места, где новый ===
отличается от старого ===
:
- New
===
вернет true, если один из массивов является подмножеством или переупорядочивает другой.
- Старый
===
вернет true, только если два массива идентичны (порядок и содержимое).
Насколько я знаю, case
/ when
- единственный раз, когда ===
может быть неявно вызван для массива.