如何获取和使用从泛型推断出的类型

时间:2018-10-23 20:29:49

标签: generics types enumerable crystal-lang

在下面的示例中,我想我必须处理一些数据结构的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)给出:

  1. 范围(Int32,Int32)

  2. Array(Char | Float64 | Int32)

  3. Array(Array(Array(Char | Float64 | Int32))

  4. 哈希(字符串,数组(字符| Float64 | Int32))

和typeof(@ data.first)给出:

  1. Int32
  2. (字符| Float64 | Int32)
  3. Array(Char | Float64 | Int32)
  4. Tuple(String,Array(Char | Float64 | Int32))

那很好,但是现在,我的问题是:如何在我的代码的其他部分中使用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的逻辑非常复杂,很难用几句话概括。 无论如何,谢谢您的帮助。

1 个答案:

答案 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