【问题标题】:When to use a class vs. module extending self in Crystal?何时在 Crystal 中使用扩展自我的类与模块?
【发布时间】:2018-10-16 11:14:48
【问题描述】:

在 Crystal 中,有两种不同的方法可以实现相似的结果:

创建一个类...

class Service
  def self.get
    # ...
  end
end

或扩展self的模块:

module Service
  extend self

  def get
    # ...
  end
end

两者都可以通过Service.get调用方法get

但是什么时候使用类或模块呢? Crystal 的类和模块有什么区别?

【问题讨论】:

    标签: class module crystal-lang


    【解决方案1】:

    classmodule 在类方法的定义上没有太大区别。然而,它们根本不同,因为类定义了可以实例化的类型 (Service.new)。模块也可以有实例方法,但不能直接实例化,只能包含在类中。

    如果您只需要类方法的命名空间,则应使用moduleclass 也适用于此,但传达了不同的含义。

    顺便说一句:虽然你不能 extendinclude 一个类,但在一个模块中你可以写 def self.get 而不是 extend

    【讨论】:

      【解决方案2】:

      但是什么时候使用类或模块呢?

      使用module。这样module 就可以用作命名空间了。

      Crystal 的类和模块有什么区别?

      module 无法实例化,可以包含在类中

      见:Modules documentation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-07
        • 2015-05-14
        • 1970-01-01
        • 1970-01-01
        • 2013-04-28
        • 1970-01-01
        • 2019-10-05
        • 1970-01-01
        相关资源
        最近更新 更多