【问题标题】:Crystal lang, type of typeCrystal lang,类型类型
【发布时间】:2021-12-24 14:40:48
【问题描述】:

我如何为其他类型、模块、类定义类型。例如:

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-lang


    【解决方案1】:

    一般来说,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#&lt;&lt;,它没有类型限制,但当然仅限于配置的编译时设置并且有许多其他限制,因此非常具体的解决方案将非常高取决于您的用例。

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

    【讨论】:

    • 谢谢,我明白了。我将使用它的父模块和泛型。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,是的,这真的不是不可能的。我会改变我的实现方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多