何时使用类与模块在Crystal中扩展self?

时间:2018-05-06 14:29:42

标签: class module crystal-lang

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

创建课程......

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

或扩展self的模块:

module Service
  extend self

  def get
    # ...
  end
end

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

但何时使用课程或模块? Crystal的类和模块之间有什么区别?

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

  

但何时使用课程或模块?

使用module。通过这种方式,module可以用作命名空间。

  

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

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

请参阅:Modules documentation