4

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

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

include MyModule

4

3 回答 3

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
于 2013-10-14T03:16:35.047 回答
1
于 2013-10-14T11:26:13.897 回答
0

一个类是一个模块,但一个模块不是一个类。Module字面上是 的超类Class。如果您了解 OOP,这就是您需要了解的全部内容。

Ruby 模块最适合用作命名空间并用于混入。

于 2013-10-14T03:20:00.063 回答