如何定义其他类型、模块和类的类型。例如:
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.class
、String.class
、Int32.class
、MyClassName.class
(是Class
,这就是我认为您需要Array(Class)
的原因。但根据您的用例,可能有其他方式来表达它