模块是一种将方法,类和常量分组在一起的方法.模块为您带来两大好处.
模块提供命名空间并防止名称冲突.
模块实现 mixin 工具.
模块定义一个命名空间,一个沙箱,你的方法和常量可以在其中播放,而不必担心被其他方法和常量踩到.
语法
module Identifier statement1 statement2 ...........end
模块常量的命名与类常量一样,带有一个初始大写字母.方法定义也类似:模块方法的定义与类方法类似.
与类方法一样,通过在模块名称和句点之前加上名称来调用模块方法,并使用模块名称和两个冒号引用常量.
示例
#!/usr/bin/ruby# Module defined in trig.rb filemodule Trig PI = 3.141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. endend
我们可以定义一个具有相同功能名称但功能不同的负模块;
#!/usr/bin/ruby# Module defined in moral.rb filemodule Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... endend
与类方法类似,无论何时定义方法模块,您指定模块名称后跟一个点,然后指定方法名称.
Ruby require语句
require语句类似于include C和C ++的声明以及Java的import语句.如果第三个程序想要使用任何已定义的模块,它可以使用Ruby require 语句简单加载模块文件 :
语法
require filename
这里,不需要提供 .rb 扩展名以及文件名.
示例
$LOAD_PATH << '.'require 'trig.rb'require 'moral'y = Trig.sin(Trig::PI/4)wrongdoing = Moral.sin(Moral::VERY_BAD)
这里我们使用 $ LOAD_PATH<< '.'让Ruby意识到必须在当前目录中搜索包含的文件.如果您不想使用$ LOAD_PATH,那么您可以使用 require_relative 来包含相关目录中的文件.
重要 : 这里,两个文件都包含相同的函数名称.因此,这会导致代码模糊,同时包含在调用程序中,但模块避免了这种代码歧义,我们可以使用模块名称调用适当的函数.
Ruby include Statement
您可以在一个类中嵌入一个模块.要在类中嵌入模块,可以在类&minus中使用 include 语句;
语法
include modulename
如果模块是在单独的文件中定义的,则需要使用包含该文件在将模块嵌入类之前需要语句.
示例
考虑用 support.rb编写的以下模块 file.
module Week FIRST_DAY = "Sunday" def Week.weeks_in_month puts "You have four weeks in a month" end def Week.weeks_in_year puts "You have 52 weeks in a year" endend
现在,您可以将此模块包含在类中,如下所示;
#!/usr/bin/ruby$LOAD_PATH << '.'require "support"class Decadeinclude Week no_of_yrs = 10 def no_of_months puts Week::FIRST_DAY number = 10*12 puts number endendd1 = Decade.newputs Week::FIRST_DAYWeek.weeks_in_monthWeek.weeks_in_yeard1.no_of_months
这将产生以下结果 :
SundayYou have four weeks in a monthYou have 52 weeks in a yearSunday120
Ruby中的Mixins
在完成本节之前,我们假设您具有面向对象概念的知识.
当一个类可以从多个父类继承特性时,该类应该显示多个继承.
Ruby不直接支持多重继承,但Ruby Modules有另一个很好的用途.一下子,它们几乎消除了对多重继承的需求,提供了一个名为 mixin 的工具.
Mixins为您提供了一种奇妙的控制方式来添加功能类.然而,当mixin中的代码开始与使用它的类中的代码交互时,它们的真正力量就会出现.
让我们检查以下示例代码以了解mixin&minus ;
module A def a1 end def a2 endendmodule B def b1 end def b2 endendclass Sampleinclude Ainclude B def s1 endendsamp = Sample.newsamp.a1samp.a2samp.b1samp.b2samp.s1
模块A由方法a1和a2组成.模块B由方法b1和b2组成.类Sample包括模块A和B.类Sample可以访问所有四种方法,即a1,a2,b1和b2.因此,您可以看到类Sample继承自两个模块.因此,您可以说类Sample显示多重继承或 mixin .