【发布时间】:2016-12-25 18:25:38
【问题描述】:
我已经问过一个相关问题here,答案确实解决了我的问题,但我对水晶检查类型的方式有一个更普遍的误解,因为我一直遇到类似的问题,所以如果有人可以帮助我解决这个问题,我会不胜感激。我已经尝试了很多可以很好地与 Ruby 一起使用的东西,但绝对不能与 Crystal 一起使用(我知道它们有很多不同,但我更熟悉 Ruby)。
这是一个类:
class Narray(T)
getter shape
getter values
@shape : Tuple(Int32, Int32) | Nil
def initialize(values : T)
@values = values
@type = T
@shape = set_shape
end
def set_shape
if (@type == Array(Array(Int32))) || (@type == Array(Array(Float64)))
return {values.size, values[0].size} # Line causing the error
elsif (@type == Array(Int32)) || (@type == Array(Float64))
return {1, @values.size}
end
end
def is_matrix?
if @values[0].is_a?(Array(Int32)) || @values[0].is_a?(Array(Float64))
return true
else
return false
end
end
end
要定义一个数组,我应该这样做:
arr1 = Narray.new([1,2,3])
这将通过set_shape 来检索数组的形状(表示行数和列数的元组)。
在这种方法中,我检查 if 语句是否为 2D 数组。
但是,在运行上面的行时,我收到了这个错误:
in script.cr:16: undefined method 'size' for Int32
return {values.size, values[0].size}
这正是第一个 if 语句应该避免的。由于我正在初始化一个一维数组,它不应该通过.size 部分。
我很确定这是一个微不足道的解释,并且有一些非常基本的东西我没有得到,但我想得到它而不是一直在这个问题上绊倒。
由于我使用的方式不正确,如何检查 Crystal 中的类型?
我尝试过使用is_a?、== Type、is_matrix? 方法(它工作正常,可以确定它是 2D 还是 1D,但仍然通过错误的部分)。
编辑:根据第一个答案,我更改了set_shape 方法:
def set_shape
if (@values.is_a? Array(Array(Int32))) || (@values.is_a? Array(Array(Float64)))
return {values.size, values[0].size}
elsif (@values.is_a? Array(Int32)) || (@values.is_a? Array(Float64))
return {1, @values.size}
end
end
但我仍然有完全相同的错误
【问题讨论】:
标签: crystal-lang