何时使用 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
中
class
和module
在class方法的定义上没有太大区别。然而,它们根本不同,因为 class 定义了一个可以实例化的类型 (Service.new
)。模块也可以有实例方法,但是不能直接实例化,只能包含在一个class.
如果只需要 class 方法的命名空间,则应使用 module
。 class
也适用于此,但传达不同的含义。
顺便说一句:虽然你不能 extend
或 include
一个 class,但在模块中你可以写 def self.get
而不是 extend
。
在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
class
和module
在class方法的定义上没有太大区别。然而,它们根本不同,因为 class 定义了一个可以实例化的类型 (Service.new
)。模块也可以有实例方法,但是不能直接实例化,只能包含在一个class.
如果只需要 class 方法的命名空间,则应使用 module
。 class
也适用于此,但传达不同的含义。
顺便说一句:虽然你不能 extend
或 include
一个 class,但在模块中你可以写 def self.get
而不是 extend
。