gpt4 book ai didi

crystal-lang - 使 Array(T) 类型的类成员属性接受 T 的二维数组

转载 作者:行者123 更新时间:2023-12-04 04:22:47 24 4
gpt4 key购买 nike

我已经定义了一个 Container 类。在@values 属性中,我需要存储一个数组,或者一个二维数组,这些数组中的元素可以是 Int32 或 Float64。如果我这样初始化它:

class Container

def initialize(value)
@values = values
end

end

我收到一个错误:@values : Type, is inferred from assignments to it across the whole program。

如果我这样定义它:

class Container

def initialize(value : Array)
@values = values
end

end

我得到:不能使用 Array(T) 作为实例变量的类型 @container(T) 的值,使用更具体的类型

我怎样才能让这个类更灵活,这样我就可以做到:

Container.new([1,2,3])
Container.new([1.0, 3.0, 4.0])
Container.new([[1, 2], [4,3,2],[1]])
Container.new([[1.0, 4.5], [2.2, 0.0]])

最佳答案

经过一些挖掘,似乎确实有一个 official way of doing this .但是,必须对其进行计划,因为在构造函数中使用该语法为我提供了从 Crystal 0.20.1 开始的以下内容

def initialize(value : Array(Array | Int32 | Float64))
@values = value
end

Error in line 3: can't use Array(T) in unions yet, use a more specific type

如果我从您的示例数据中理解正确,那么类型似乎是同类的(即数组将始终包含一种特定类型)。如果是这种情况,您可以简单地重载构造函数。这不是一个很好的解决方案,但也许它可以让您束手无策。

class Container

def initialize(value : Array(Array))
@values = value
calculate
end

def initialize(value : Array(Int32))
@values = value
calculate
end

def initialize(value : Array(Array(Int32)))
@values = value
calculate
end

def initialize(value : Array(Array(Float64)))
@values = value
calculate
end

def initialize(value : Array(Float64))
@values = value
calculate
end

def calculate
# do stuff here
end

end

Container.new([1,2,3])
Container.new([1.0, 3.0, 4.0])
Container.new([[1, 2], [4,3,2],[1]])
Container.new([[1.0, 4.5], [2.2, 0.0]])

编辑:

由于@Sija 的评论,您似乎可以在不指定类型的情况下使用@faaq 的解决方案。他们还分享了this sample code ,我认为这比重载构造函数要干净得多。

关于crystal-lang - 使 Array(T) 类型的类成员属性接受 T 的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41291605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com