我试图从设计模式的角度来理解Ruby模块的目的。
Ruby模块本质上只是一个只初始化一次的类吗?
include MyModule
答案 0 :(得分:11)
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
答案 1 :(得分:1)
模块在Ruby中有两种用途:常量的命名空间和mixins。
常量的命名空间仅表示在
中FOO = 1
module Bar
FOO = 2
end
module Baz
FOO = 3
end
三个不同的命名空间中有三个不同的FOO
:一个在全局命名空间(实际上是Object
),一个在Bar
中,一个在Baz
中。
更有趣的用例是mixins:mixin基本上是一个在其超类上进行参数化的类。或者,换句话说:mixin是一个可以在继承图中多次出现的类,每次都有不同的超类。
将此与多重继承进行对比:在多重继承中,类只能在继承图中出现一次,但它可能包含多个超类。 mixin在继承图中可能会出现多次次,但每次出现只有一个超类。
特别是,当您将模块M
混合到类C
中时,Ruby中发生的是实际类(所谓的包含类)创建)(让我们称之为M′
),其方法表,常量表和变量表指针指向M
的方法表,常量表和变量表格,该班级M′
成为C
的超类,旧的超类成为M′
的超类。
答案 2 :(得分:0)
类是模块,但模块不是类。 Module
实际上是Class
的超类。如果您知道OOP,那就是您需要知道的全部内容。
Ruby模块最好用作命名空间并在mixins中使用。