Module:

  模块的定义和类比较相似,使用module关键字。但模块不能被实例化,也不能被子类化,模块是独立的,且一个模块对像是Module类的一个实例。模块最常用的两个用途是作为命空间和混入(mixin)。 

     在模块中,可以定义实例变量、实例方法、类变量、类方法和属性等,并且在模块中还可能以定义类和模块。在类中也可以定义模块。 

     在访问模块中的实例成员,需要在类中饱含模块,然后实例化类以访问模块的实例成员。

  

module FirstModule
                    def go
                         puts "Go home"
                    end
 
                    def self.show   #or FirstModule.show
                         puts "It's a red car."
                    end
      end
      FirstModule.show    #It's a red car.
 
    class Car
                    include FirstModule              #在类中插入
    end
    car = Car.new
    car.go         #Go home

 

a)模块内方法调用:

module Test
      def self.function
        puts “ this is function test”
      end
      end

    调用:Test.function

module Test2
     class TestClass
        def performance
           puts “this is performance test”
        end
     end
  end

    调用:Test2::TestClass.new.performance

 

b)模块常量调用

module TestConst
     PI = 3.14
  end

  调用:TestConst::PI

 

c) 模块用于命令空间(Namespace):防止命令冲突,这个就不多说了。

d) 模块用于混入(Mixins):

  目的是实现多继承在类中混入模块和从基类继承非常相似,为的实例对像都可以调用实例成员,上面也提到了。在类中可以包含多个模块,但是类却不能继承自多个类。当需要给类的实例添加很多附加功能,且不想把这些功能全部放在基类中时,就可以使用模块来组织代码。

 

e) 加载和请求模块

      i.  有时会把不同的类或模块存放在不同的文件中,在使用这些文件时,就需要使用load和require来加载这些文件。在使用文件中的模块和对象时,还需要使用include和extend方法。 

require 和 load的区别:

  1. load方法参数要求是包括文件扩展名的完整文件名,require则只需要传入库的名字,不需要像文件名那样的后缀;
  2. load把一个文件加载多次,而require则最多只能加载一次;
  3. require方法不公可以加载ruby源文件,还可以加载其它语言编写的源文件;load方法的作用就是复制和粘贴;

include方法:

    该方法主要用来将一个模块插入(混入)到一个类或者其它模块。在类定义中引入模块,使模块中的方法成为类的实例方法;这个模块的方法在引入它的类或模块中以函数的形式调用,include 并非将模块的实例方法简单 拷贝到类中, 而是建立了一个类到模块的引用。,如;

  模块,文件名为:TestModule

module Foo
        def hello
           puts "This is my first module in Ruby!"
        end
       end

 

  另有一个类文件名为:Test                #Test类和TestModule模块在同一路径下

   

#require  "D:/cucumber/Ruby/Module"      #(加载文件)绝对路径
    require “../Ruby/Module"                           #(加载文件)相对路径
 
    class TestOne
        include Foo               #混入模块
          def hi
              puts "This is a class"
          end
    end 
    a=TestOne.new
    a.hi
    a.hello

 

extend方法:

    extend 用来在一个对象(object,或者说是instance)中引入一个模块,这类从而也具备了这个模块的方法,如:

 

module FirstModule
             def helloMod
                   puts "This is a module."
             end
    end
 
    class FirstClass
             def helloClass
                 puts  "This is a class."
             end
    end 
   c=FirstClass.new
   c.helloClass        #This is a class.
   c.extend(FirstModule)
   c.helloMod          #This is a module.

加载路径:

    Ruby的加载路径是一个数组,可以使用全局变量$LOAD_PATH 或 $:进行访问。数组的每个元素都是一个目录史,ruby在这些目录中查找加载的文件,前面的目录比后面的目录优选被查找;可以使用 puts $: 输出路径;Ruby程序也可以通过修改$LOAD_PATH($:)数组的内容来修改加载路径;如:

puts $:
   $: << "../.."           #修改加载路径的值
   puts"@@@@@@@"
     puts $:

         

  当然,我们可以对load或require使用绝对路径,这样可以完全绕过加载路径;