Ruby не имеет каких-либо препятствий для case
.
Один альтернативный вариант - серия операторов if
с использованием метода ===
, который case
использует для внутреннего использования.для сравнения предметов.
has_matched? = false
if '2' === var
has_matched? = true
# stuff
end
if '3' === var
has_matched? = true
# other stuff
end
if something_else === var
has_matched? = true
# presumably some even more exciting stuff
end
if !has_matched?
# more stuff
end
У этого есть две вопиющие проблемы.
Это не очень СУХОЙ : has_matched? = true
засореноповсюду.
Вы всегда должны помнить, чтобы поместить var
справа от ===
, потому что это то, что case
делает за кулисами.
Вы можете создать свой собственный класс с помощью метода matches?
, который инкапсулирует эту функциональность.Он может иметь конструктор, который принимает значение, с которым вы будете сопоставлять (в данном случае, var
), и он может иметь метод else_do
, который выполняет свой блок, только если его внутренняя переменная @has_matched?
экземпляра все еще равна false.
Редактировать:
Метод ===
может означать все, что вы хотите, чтобы это значило.Как правило, это более «прощающий» способ проверить эквивалентность между двумя объектами.Вот пример из этой этой страницы :
class String
def ===(other_str)
self.strip[0, other_str.length].downcase == other_str.downcase
end
end
class Array
def ===(str)
self.any? {|elem| elem.include?(str)}
end
end
class Fixnum
def ===(str)
self == str.to_i
end
end
По существу, когда Ruby встречает case var
, он вызовет ===
для объектов , против которых высравниваем var
.