Допустим, у меня есть следующая функция:
def encode(obj)
case obj
when Int32
"i#{obj}e"
when String
"#{obj.size}:#{obj}"
when Symbol
encode(obj.to_s)
when Array
obj.reduce "a" {|acc, i| acc + encode(i)} + "e"
else
raise ArgumentError.new "Cannot encode argument of class '#{obj.class}'"
end
end
И я хочу избавиться от этой ветки else, чтобы сделать проверку во время компиляции на тип аргумента. Я могу написать что-то вроде этого:
def encode(obj : Int32 | String | Symbol | Array)
В этом случае все в порядке. Но что, если есть больший список типов? Есть ли более элегантный способ сделать это? Я хочу, чтобы компилятор проверил, что эта функция принимает только те типы, которые соответствуют в выражении case.