在下面的示例中,我想我必须处理一些数据结构的Enumerable类型,该结构由乱码填充:
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)
Array(Char | Float64 | Int32)
Array(Array(Array(Char | Float64 | Int32))
哈希(字符串,数组(字符| Float64 | Int32))
和typeof(@ data.first)给出:
那很好,但是现在,我的问题是:如何在我的代码的其他部分中使用Crystal Compiler推断出的任何类型?还是根本不可能?!
谢谢
[编辑] 我的问题来自于我的项目,该项目是使用Ruby编写的个人应用程序适应Crystal语言(我正在发现)。该应用程序使用了Ruby Gem Tabulo(https://github.com/matt-harvey/tabulo),因此,我也在尝试将此Gem适应Crystal语言。
此Ruby Gem旨在通过定义要显示的列来格式化数据表(实际上是任何类型的可枚举数据结构)。这是通过函数“ add_column”完成的,该函数的参数中包括各种格式化属性,更重要的是,在“行”级别具有一个访问基础数据的块(其类型由typeof(@ data.first给出) )中的示例代码)。我通过获取特定类型的数据进行了调整:Array(Array(Float64))。它奏效了,我现在的目标是使这种适应性通用,很可能采用任何类型的可枚举数据输入,如上面的示例代码所示。
因此,就我(较差的)技能所允许的我了解在这种情况下Crystal的工作方式而言,我需要使用输入数据结构定义的数据类型。
很抱歉,如果这种解释有点缺乏细节,但是Tabulo Gem的逻辑非常复杂,很难用几句话概括。 无论如何,谢谢您的帮助。
答案 0 :(得分:0)
因此,我仍然很难理解您要执行的操作。如果要根据类型进行分支,则可以使用DT[DT[,do.call(order, .SD), .SDcols = c(3, 1)]]
# a b c
#1: 2 4 1
#2: 1 3 2
#3: 5 2 3
#4: 3 NA NA
#5: 4 5 NA
。
case
也许您正在寻找Enumerable,它提供了可用于所有不同类型的一组方法?
var = 5
var = 5..10 if Random.rand > 0.5
case var
when Int32
puts "int inside here"
when Range(Int32, Int32)
puts "range inside here"
end