【发布时间】:2019-03-28 04:24:57
【问题描述】:
在下面的例子中,我想我必须处理一些数据结构的 Enumerable 类型,由 litterals 填充:
module TestGenerics
class Foo(T)
include Enumerable(T)
def initialize(@data : T)
typeof(@data)
typeof(@data.first)
end
end
Foo.new(1..3)
Foo.new([1, 'A', 3.14])
Foo.new([[1, 'A', 3.14], [2, 'Z', 9.99]])
Foo.new({"A" => [1, 'A', 3.14], "B" => [2, 'Z', 9.99]})
end
对于 Foo 类的每个实例,typeof(@data) 给出:
范围(Int32,Int32)
数组(Char | Float64 | Int32)
Array(Array(Char | Float64 | Int32))
Hash(String, Array(Char | Float64 | Int32))
并且 typeof(@data.first) 给出:
- Int32
- (Char | Float64 | Int32)
- 数组(Char | Float64 | Int32)
- 元组(字符串,数组(Char | Float64 | Int32))
很好,但现在,我的问题是:如何在我的代码的其他部分使用 Crystal 编译器推断的任何这些类型?还是根本不可能?!
谢谢
[编辑] 我的问题源于我的项目,以使用 Ruby 编写的个人应用程序适应 Crystal 语言(我正在发现)。此应用程序使用 Ruby Gem Tabulo (https://github.com/matt-harvey/tabulo),因此我也在尝试将此 Gem 调整为 Crystal 语言。
这个 Ruby Gem 旨在通过定义要显示的列来格式化数据表(实际上是任何类型的可枚举数据结构)。这是由函数“add_column”完成的,它的参数中有各种格式属性,更重要的是,在“行”级别访问底层数据的块(其类型由 typeof(@data.first ) 在示例代码中)。我通过采用特定类型的数据进行了调整:Array(Array(Float64))。它有效,我现在的目标是使这种适应通用化,可能采用任何类型的 Enumerable 数据输入,如上面的示例代码所示。
所以,就我(较差的)技能让我了解 Crystal 在这种情况下是如何工作的而言,我需要使用输入数据结构定义的数据类型。
对不起,如果这个解释有点缺乏细节,但禁忌宝石的逻辑相当复杂,很难用几句话来概括。 无论如何,感谢您的帮助。
【问题讨论】:
-
你想对这些类型做什么?不然给你回复有点难……
-
请看原文编辑
标签: generics types enumerable crystal-lang