何时使用 class 与在 Crystal 中扩展自身的模块?

When to use a class vs. module extending self in Crystal?

在Crystal中,有两种不同的方法可以达到相似的效果:

正在创建 class...

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

或模块扩展 self:

module Service
  extend self

  def get
    # ...
  end
end

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

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

But when to use a class or a module?

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

What's the difference between Crystal's classes and modules?

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

参见:Modules documentation

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

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

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