Ruby - 模块和混合

模块是一种将方法,类和常量分组在一起的方法.模块为您带来两大好处.

  • 模块提供命名空间并防止名称冲突.

  • 模块实现 mixin 工具.

模块定义一个命名空间,一个沙箱,你的方法和常量可以在其中播放,而不必担心被其他方法和常量踩到.

语法

module Identifier
   statement1
   statement2
   ...........
end

模块常量的命名与类常量一样,带有一个初始大写字母.方法定义也类似:模块方法的定义与类方法类似.

与类方法一样,通过在模块名称和句点之前加上名称来调用模块方法,并使用模块名称和两个冒号引用常量.

示例

#!/usr/bin/ruby

# Module defined in trig.rb file

module Trig
   PI = 3.141592654
   def Trig.sin(x)
   # ..
   end
   def Trig.cos(x)
   # ..
   end
end

我们可以定义一个具有相同功能名称但功能不同的负模块;

#!/usr/bin/ruby

# Module defined in moral.rb file

module Moral
   VERY_BAD = 0
   BAD = 1
   def Moral.sin(badness)
   # ...
   end
end

与类方法类似,无论何时定义方法模块,您指定模块名称后跟一个点,然后指定方法名称.

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"
   end
end

现在,您可以将此模块包含在类中,如下所示;

#!/usr/bin/ruby
$LOAD_PATH << '.'
require "support"

class Decade
include Week
   no_of_yrs = 10
   def no_of_months
      puts Week::FIRST_DAY
      number = 10*12
      puts number
   end
end
d1 = Decade.new
puts Week::FIRST_DAY
Week.weeks_in_month
Week.weeks_in_year
d1.no_of_months

这将产生以下结果 :

Sunday
You have four weeks in a month
You have 52 weeks in a year
Sunday
120

Ruby中的Mixins

在完成本节之前,我们假设您具有面向对象概念的知识.

当一个类可以从多个父类继承特性时,该类应该显示多个继承.

Ruby不直接支持多重继承,但Ruby Modules有另一个很好的用途.一下子,它们几乎消除了对多重继承的需求,提供了一个名为 mixin 的工具.

Mixins为您提供了一种奇妙的控制方式来添加功能类.然而,当mixin中的代码开始与使用它的类中的代码交互时,它们的真正力量就会出现.

让我们检查以下示例代码以了解mixin&minus ;

module A
   def a1
   end
   def a2
   end
end
module B
   def b1
   end
   def b2
   end
end

class Sample
include A
include B
   def s1
   end
end

samp = Sample.new
samp.a1
samp.a2
samp.b1
samp.b2
samp.s1

模块A由方法a1和a2组成.模块B由方法b1和b2组成.类Sample包括模块A和B.类Sample可以访问所有四种方法,即a1,a2,b1和b2.因此,您可以看到类Sample继承自两个模块.因此,您可以说类Sample显示多重继承或 mixin .