koj*_*ix2 1 switch-statement crystal-lang
我想在Crystal lang而不是1d数组中只转换2d数组.所以我在下面写下switch语句.
a = [[1,2,3],[11,12,13]]
b = [1,2,3]
class Array
def meow
case self.first
when Array
puts self.transpose
else
puts "OK"
end
end
end
a.meow
b.meow
Run Code Online (Sandbox Code Playgroud)
此代码不起作用.我该如何解决?这是错误消息.
Error in foo.cr:16: instantiating 'Array(Int32)#meow()'
b.meow
^~~~
in foo.cr:8: instantiating 'Array(Int32)#transpose()'
puts self.transpose
^~~~~~~~~
in /usr/share/crystal/src/array.cr:1642: undefined method 'first' for Int32
return Array(Array(typeof(first.first))).new if empty?
^~~~~
Run Code Online (Sandbox Code Playgroud)
首先,通常不建议从标准库中添加补丁类型.
通过将数组作为参数分配给方法并将类型限制为,可以相对容易地解决问题Array(Array).不需要为任何子类型添加细节.
def meow(array : Array(Array))
array.transpose
end
meow [[1, 2, 3], [11, 12, 13]] # => [[1, 11], [2, 12], [3, 13]]
meow [[1, 2, 3], ["a", "b", "c"]] # => [[1, "a"], [2, "b"], [3, "c"]]
Run Code Online (Sandbox Code Playgroud)
您可能不需要接受一维数组的方法,因此meow [1, 2, 3]会导致编译器错误.
但是可以添加这样的重载:
def meow(array : Array)
"OK"
end
Run Code Online (Sandbox Code Playgroud)