何时在Crystal中使用类(Class)和扩展self的模块(Module)?

7
在Crystal中,有两种不同的方法可以实现类似的结果:
创建一个类...
class Service
  def self.get
    # ...
  end
end

或者一个扩展self的模块:

module Service
  extend self

  def get
    # ...
  end
end

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

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

2个回答

9

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

如果你只需要一个类方法的命名空间,你应该使用moduleclass也可以正常工作,但传达了不同的含义。

顺便说一下:虽然你不能extendinclude一个类,在一个模块中,你可以写def self.get代替extend


3
当需要使用命名空间时,应该使用module
Crystal中类和模块的区别在于,module不能被实例化,但可以包含在类中。
详见:Modules文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接