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

alt*_*alt 3 ruby design-patterns module

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

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

include MyModule

Way*_*rad 11

ruby类是一个可以创建实例的模块.像类一样,模块可以有方法,但是你不能创建模块的实例.这是他们之间的唯一区别.

在实践中,模块通常用于:

  • 名称空间
  • 混入
  • 保持功能

名称空间

以下是用作名称空间的模块示例:

module MyLib
  class Foo
  end
  class Bar
  end
end
Run Code Online (Sandbox Code Playgroud)

这些类的全名是MyLib :: Foo和MyLib :: Bar.因为它们包含在命名空间中(可能是唯一的),所以名称Foo和Bar不能与程序或其他库中定义的Foo或Bar冲突.

混入

这是一个用作混合的模块:

module Mixin
  def foo
    puts "foo"
  end
end
Run Code Online (Sandbox Code Playgroud)

由于您无法创建Mixin模块的实例,因此您可以通过包含(混合)模块来访问foo:

class MyClass
  include Mixin
end

MyClass.new.foo    # => foo
Run Code Online (Sandbox Code Playgroud)

功能

像类一样,模块可以保存不在任何实例上运行的函数.为此,您可以在模块中定义类方法:

module SomeFunctions
  def self.foo
    puts "foo"
  end
end
Run Code Online (Sandbox Code Playgroud)

模块中定义的类方法就像类中定义的类方法一样.打电话给它:

SomeFunctions.foo    # => foo
Run Code Online (Sandbox Code Playgroud)