上一节:
下一节:

  Ruby 模块和混入

  • 模块和混入

    模块是将方法,类和常量分组在一起的一种方式。模块有两个主要好处。
    • 模块提供名称空间并防止名称冲突。
    • 模块实现了mixin功能。
    模块定义一个名称空间,一个沙箱,您的方法和常量可以在其中使用,而不必担心被其他方法和常量所混淆冲突。
    语法
    
    module Identifier
       statement1
       statement2
       ...........
    end
    
    模块常量的名称与类常量相同,并以大写字母开头。方法定义也看起来相似:模块方法的定义就像类方法一样。与类方法一样,您可以通过在模块名称前加上模块名称和句点来调用模块方法,并使用模块名称和两个冒号来引用常量。
    示例
    
    # 在 trig.rb 文件定义
    
    module Trig
       PI = 3.141592654
       def Trig.sin(x)
       # ..
       end
       def Trig.cos(x)
       # ..
       end
    end
    
    我们可以再定义一个具有相同功能名称但功能不同的模块-
    
    # 在 moral.rb 文件定义
    
    module Moral
       VERY_BAD = 0
       BAD = 1
       def Moral.sin(badness)
       # ...
       end
    end
    
    与类方法一样,每当在模块中定义方法时,都需要指定模块名称,后跟一个点,然后指定方法名称。
  • require语句

    require语句类似于C和C++的include语句以及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包括相对目录中的文件。重要信息 -此处,两个文件包含相同的功能名称。因此,这将导致代码歧义性,同时包含在调用程序中,但模块避免了这种代码歧义性,并且我们能够使用模块名来调用适当的函数。
  • include声明

    您可以将模块嵌入类中。要将模块嵌入类中,请在类中使用include语句-
    
    include modulename
    
    如果模块是在单独的文件中定义的,则在将模块嵌入类之前,需要使用require语句包括该文件。
    示例:
    考虑以下写在support.rb文件中的模块。
    
    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
    
    现在,您可以将该模块包含在类中,如下所示:
    
    $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-
    
    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。
上一节:
下一节: