文章出處

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使用絕對路徑,這樣可以完全繞過加載路徑;


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()