Ruby模块可以被描述为单例类吗?

时间:2013-10-14 02:56:22

标签: ruby design-patterns module

我试图从设计模式的角度来理解Ruby模块的目的。

Ruby模块本质上只是一个只初始化一次的类吗?

include MyModule

3 个答案:

答案 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中使用。