当前位置:  首页>> 技术小册>> Ruby入门教程

模块(Module)是一种把方法、类和常量组合在一起的方式。模块(Module)为您提供了两大好处。

模块提供了一个命名空间和避免名字冲突。
模块实现了 mixin 装置。
模块(Module)定义了一个命名空间,相当于一个沙盒,在里边您的方法和常量不会与其他地方的方法常量冲突。

模块类似与类,但有以下不同:

模块不能实例化
模块没有子类
模块只能被另一个模块定义

语法

  1. module Identifier
  2. statement1
  3. statement2
  4. ...........
  5. end

模块常量命名与类常量命名类似,以大写字母开头。方法定义看起来也相似:模块方法定义与类方法定义类似。

通过类方法,您可以在类方法名称前面放置模块名称和一个点号来调用模块方法,您可以使用模块名称和两个冒号来引用一个常量。

实例

  1. #!/usr/bin/ruby
  2. # 定义在 trig.rb 文件中的模块
  3. module Trig
  4. PI = 3.141592654
  5. def Trig.sin(x)
  6. # ..
  7. end
  8. def Trig.cos(x)
  9. # ..
  10. end
  11. end

我们可以定义多个函数名称相同但是功能不同的模块:

实例

  1. #!/usr/bin/ruby
  2. # 定义在 moral.rb 文件中的模块
  3. module Moral
  4. VERY_BAD = 0
  5. BAD = 1
  6. def Moral.sin(badness)
  7. # ...
  8. end
  9. end

就像类方法,当您在模块中定义一个方法时,您可以指定在模块名称后跟着一个点号,点号后跟着方法名。

Ruby require 语句

require 语句类似于 C 和 C++ 中的 include 语句以及 Java 中的 import 语句。如果一个第三方的程序想要使用任何已定义的模块,则可以简单地使用 Ruby require 语句来加载模块文件:

语法

  1. require filename

在这里,文件扩展名 .rb 不是必需的。

实例

  1. $LOAD_PATH << '.'
  2. require 'trig.rb'
  3. require 'moral'
  4. y = Trig.sin(Trig::PI/4)
  5. wrongdoing = Moral.sin(Moral::VERY_BAD)

在这里,我们使用 $LOAD_PATH << ‘.’ 让 Ruby 知道必须在当前目录中搜索被引用的文件。如果您不想使用 $LOAD_PATH,那么您可以使用 require_relative 来从一个相对目录引用文件。

注意:在这里,文件包含相同的函数名称。所以,这会在引用调用程序时导致代码模糊,但是模块避免了这种代码模糊,而且我们可以使用模块的名称调用适当的函数。

Ruby include 语句

您可以在类中嵌入模块。为了在类中嵌入模块,您可以在类中使用 include 语句:

语法

  1. include modulename

如果模块是定义在一个单独的文件中,那么在嵌入模块之前就需要使用 require 语句引用该文件。

实例
假设下面的模块写在 support.rb 文件中。

  1. module Week
  2. FIRST_DAY = "Sunday"
  3. def Week.weeks_in_month
  4. puts "You have four weeks in a month"
  5. end
  6. def Week.weeks_in_year
  7. puts "You have 52 weeks in a year"
  8. end
  9. end

现在,您可以在类中引用该模块,如下所示:

实例

  1. #!/usr/bin/ruby
  2. $LOAD_PATH << '.'
  3. require "support"
  4. class Decade
  5. include Week
  6. no_of_yrs=10
  7. def no_of_months
  8. puts Week::FIRST_DAY
  9. number=10*12
  10. puts number
  11. end
  12. end
  13. d1=Decade.new
  14. puts Week::FIRST_DAY
  15. Week.weeks_in_month
  16. Week.weeks_in_year
  17. d1.no_of_months

这将产生以下结果:

  1. Sunday
  2. You have four weeks in a month
  3. You have 52 weeks in a year
  4. Sunday
  5. 120

Ruby 中的 Mixins

在阅读本节之前,您需要初步了解面向对象的概念。

当一个类可以从多个父类继承类的特性时,该类显示为多重继承。

Ruby 不直接支持多重继承,但是 Ruby 的模块(Module)有另一个神奇的功能。它几乎消除了多重继承的需要,提供了一种名为 mixin 的装置。

Ruby 没有真正实现多重继承机制,而是采用成为mixin技术作为替代品。将模块include到类定义中,模块中的方法就mix进了类中。

让我们看看下面的示例代码,深入了解 mixin:

实例

  1. module A
  2. def a1
  3. end
  4. def a2
  5. end
  6. end
  7. module B
  8. def b1
  9. end
  10. def b2
  11. end
  12. end
  13. class Sample
  14. include A
  15. include B
  16. def s1
  17. end
  18. end
  19. samp=Sample.new
  20. samp.a1
  21. samp.a2
  22. samp.b1
  23. samp.b2
  24. samp.s1

模块 A 由方法 a1 和 a2 组成。
模块 B 由方法 b1 和 b2 组成。
类 Sample 包含了模块 A 和 B。
类 Sample 可以访问所有四个方法,即 a1、a2、b1 和 b2。
因此,您可以看到类 Sample 继承了两个模块,您可以说类 Sample 使用了多重继承或 mixin 。


该分类下的相关小册推荐:

暂无相关推荐.