水晶郎,类型的类型



如何定义其他类型、模块和类的类型。例如:

module One
end
module Two
end
array_of_modules = Array(?).new
array_of_modules << One
array_of_modules << Two

或者对于类

array_of_types = Array(?).new
array_of_types << String
array_of_types << Int32
array_of_types << MyClassName

一般来说,这在Crystal中是不可能的。

如果你事先知道所有可能的类型,你可以定义一个联合:

types = [] of String.class|Int32.class
types << String
types << Int32
pp types # => [String, Int32]

诚然,这并不是很有用。这就是为什么当谈到你或你的用户控制的模块和类时,一个常见的解决方法是使用某种标记模块:

module Base
end
module Foo
extend Base
end
class Bar
extend Base
end
types = [] of Base
types << Foo
types << Bar
pp types # => [Foo, Bar]

最后,另一种常见的方法是使用宏ArrayLiteral#<<,它没有类型限制,但当然仅限于配置的编译时设置,并且有许多其他限制,因此一个非常具体的解决方案在很大程度上取决于您的用例。

{% begin %}
{% types = [] of Nil # Dummy type, could be whatever
types << Foo
types << Bar %}
pp {{types}} # => [Foo, Bar]
{% end %}

据我所知,这是不可能的,因为Crystal不支持Array(Class)

您的示例中的类型(例如One.classString.classInt32.classMyClassName.class(是Class,这就是我认为您需要Array(Class)的原因。但根据您的用例,可能有其他方式来表达它

相关内容

  • 没有找到相关文章

最新更新