新人學ruby---ruby中的模塊


模塊

模塊是什麼

ruby同JAVA一樣只支持單繼承,每個類只能有一個父類,爲了提高程序的靈活性ruby引入了 模塊 爲實現多重繼承提供了可能。模塊可以說是類的一個補充,但是模塊於類有兩個不同:
  • 模塊不能擁有實例
  • 模塊不能被繼承

如何創建模塊

關鍵字:module

語法規則:

module 模塊名
    模塊的定義
end

注意:

模塊名必須是大寫字母開頭


模塊的作用

提供命名空間(解決重名問題)

這個個人理解類似JAVA的包,用於對方法,常量,類等名稱進行區分及管理。模塊提供獨立的命名空間,例如模塊A中的say_hello方法和模塊B中的say_hello方法是屬於不同的方法。
例子:

module HelloModule
    # 定義常量
      Version = 'v1.0'
    # 定義方法
      def say_hello(name)
        puts "hello,#{name}"
      end

      # 指定say_hello 方法爲模塊函數
      module_function :say_hello
    end

註釋:
module_function: 的作用是把方法作爲模塊函數公開給外部使用,module_function後面跟的參數是方法名。

利用Mix-in擴展功能(解決ruby單繼承)

什麼是Mix-in?

Mix-in 就是將模塊混合到類中。在定義類時使用include,從而在類中可以使用模塊裏的常量、方法等

例子1:使用關鍵字 include 使類包含模塊
代碼:

    module Mod
      def meth
        puts "這是module"
      end
    end

    class ModuleDemo01
      include Mod
    end

    mod = ModuleDemo01.new
    mod.meth

輸出:
這是module

如果想校驗類是否包含某個模塊可以用如下方式:
類名.include?(模塊名) 返回true or false.

使用Mix-in 時方法的查找順序

1)同繼承關係一樣,類自身已經定義了同名方法時,優先使用類自身的方法。
    例子:

    module Mod
      def meth
        puts "這是module"
      end
    end

    class ModuleDemo01
      include Mod

      def meth
        puts "這個是類的方法"
      end
    end

    mod = ModuleDemo01.new
    mod.meth

輸出:
這個是類的方法

2)一個類中包含多個模塊,優先使用最後一個包含的模塊
例子:

module Mod1
      def meth
        puts "這是Mod1"
      end
    end

    module Mod2
      def meth
        puts "這是Mod2"
      end
    end

    class ModuleDemo01
      include Mod1
      include Mod2
    end

    mod = ModuleDemo01.new
    mod.meth

輸出:

這是Mod2

3)多級嵌套include時,查找順序也是線性的。
例子:

    module Mod1
      def meth
        puts "這是Mod1"
      end
    end

    module Mod2
      def meth
        puts "這是Mod2"
      end
    end

    module Mod3
      include Mod2
    end

    class ModuleDemo01
      include Mod1
      include Mod3
    end

    mod = ModuleDemo01.new
    mod.meth

    p ModuleDemo01.ancestors

輸出:
這是Mod2
[ModuleDemo01, Mod3, Mod2, Mod1, Object, Kernel, BasicObject]

註釋: 通過 類名.ancetores方法可以查看該類的繼承關係和順序。

4)如果相同模塊被包含兩次以上(含兩次),則第二次後的會被忽略。
例子:

 module Mod1
      def meth
        puts "這是Mod1"
      end
    end

    module Mod2
      def meth
        puts "這是Mod2"
      end
    end

    module Mod3
      include Mod2
      include Mod1
      include Mod2
    end

    class ModuleDemo01
      include Mod1
      include Mod3
    end

    mod = ModuleDemo01.new
    mod.meth

    p ModuleDemo01.ancestors

輸出:

這是Mod1
[ModuleDemo01, Mod3, Mod1, Mod2, Object, Kernel, BasicObject]

通過Mix-in 解決ruby單繼承問題

其實從上面例子就可以看出,一個類可以多個include多個模塊,並擁有模塊的方法,下面這個例子可以更直接看出:

例子:

 module Mod1
      def meth
        puts "這是Mod1"
      end
    end

    module Mod2
      def meth
        puts "這是Mod2"
      end
    end

    module Mod3
      include Mod2
      include Mod1

      def meth3
        puts "這個Mod3的meth3"
      end
    end

    class ModuleDemo01
      include Mod1
      include Mod3
    end

    mod = ModuleDemo01.new
    mod.meth
    mod.meth3

輸出:
這是Mod1
這個Mod3的meth3


參考來源:《ruby基礎教程》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章