Ruby学习笔记-Module

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方法。 

      ii. require 和 load的区别

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

      iii.   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

 

       iv. 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.

 

       v.   加载路径

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

       puts $:

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

   puts"@@@@@@@"

     puts $:             

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

posted @ 2012-01-20 11:19 贺满 阅读(...) 评论(...) 编辑 收藏