Ruby學習筆記-Module

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.