Лол, я люблю ответ Амадана.И если вы действительно хотите использовать оператор case, вы, вероятно, должны делать то, что сказал Zepplock (хотя вместо строк могут рассматриваться символы), но в зависимости от вашего варианта использования вам нужно решение на основе более if-оператора, например, Salil.
Во всяком случае, подумал, что я бы добавил и тоже повеселился ^ _ ^ Вот решение, которое будет работать с тем, что вы сказали, оно создает объекты, которые отвечают на === (какие выражения используют), затем онивызовите метод интереса (блокировка или запрет) и верните его.Вам, вероятно, следует поместить их в какой-либо конфигурационный файл или инициализатор или иным образом сохранить результаты после первого вызова, чтобы сохранить производительность (ваше приложение должно создавать эти объекты только один раз)
user = Class.new do
def ban() true end
def lock() true end
end.new
def banned?
ban_checker = Object.new
def ban_checker.===(user) user.ban end
ban_checker
end
def locked?
lock_checker = Object.new
def lock_checker.===(user) user.lock end
lock_checker
end
case user
when banned?
puts 'banned'
when locked?
puts 'locked'
else
puts 'default'
end
ПримечаниеЯ не защищаю это решение, потому что оно нарушает инкапсуляцию.Забаненный должен быть определен и использован для вашего пользователя, но чтобы это работало, он должен быть определен во вложенной области видимости.Я в основном поднимаю это для удовольствия:)