【发布时间】:2018-05-09 17:57:41
【问题描述】:
假设我有以下功能:
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 表达式中匹配的类型。
【问题讨论】:
标签: switch-statement type-inference crystal-lang