我试图从设计模式的角度来理解 Ruby 模块的目的。
Ruby 模块本质上只是一个只初始化一次的类吗?
include MyModule
ruby 类是一个可以创建实例的模块。像类一样,模块可以有方法,但不能创建模块的实例。这是他们之间的唯一区别。
在实践中,模块通常用于:
下面是一个用作命名空间的模块示例:
module MyLib
class Foo
end
class Bar
end
end
这些类的全称是 MyLib::Foo 和 MyLib::Bar。因为它们包含在名称空间中(可能是唯一的),名称 Foo 和 Bar 不能与您的程序或另一个库中定义的 Foo 或 Bar 冲突。
这是一个用作混合的模块:
module Mixin
def foo
puts "foo"
end
end
由于您无法创建 Mixin 模块的实例,因此您可以通过包含(混入)该模块来访问 foo:
class MyClass
include Mixin
end
MyClass.new.foo # => foo
与类一样,模块可以包含不对任何实例进行操作的函数。为此,您在模块中定义类方法:
module SomeFunctions
def self.foo
puts "foo"
end
end
在模块中定义的类方法就像在类中定义的类方法。调用它:
SomeFunctions.foo # => foo
一个类是一个模块,但一个模块不是一个类。Module
字面上是 的超类Class
。如果您了解 OOP,这就是您需要了解的全部内容。
Ruby 模块最适合用作命名空间并用于混入。