Проблема с использованием чего-то подобного:
case a.to_s
when "String" then ...
when "Fixnum" then ...
end
заключается в том, что он полностью пропускает подклассы, поэтому вы можете получить что-то, что является String, но пропущено вашей первой веткой.Кроме того, name
будет лучшим выбором, чем to_s
, поскольку семантически вы проверяете имя класса, а не его строковое представление;результат может быть таким же, но case a.name
будет более понятным.
Если вы хотите использовать case
и иметь дело с подклассами, тогда вы можете использовать Module#<=
следующим образом:
case
when a <= String then ...
when a <= Fixnum then ...
end
Да, вы должны повторять a
в каждом when
, но именно так работает case
.