Ruby - 模組和Mixin



模組是將方法、類和常量組合在一起的一種方式。模組為您提供了兩個主要好處。

  • 模組提供了一個名稱空間,並防止命名衝突。

  • 模組實現了Mixin功能。

模組定義了一個名稱空間,一個沙盒,您的方法和常量可以在其中執行,而無需擔心被其他方法和常量覆蓋。

語法

module Identifier
   statement1
   statement2
   ...........
end

模組常量與類常量的命名方式相同,以大寫字母開頭。方法定義也看起來很相似:模組方法的定義方式與類方法相同。

與類方法一樣,您可以透過在模組名稱前加上模組名稱和一個句點來呼叫模組方法,並且您可以使用模組名稱和兩個冒號來引用常量。

示例

#!/usr/bin/ruby

# Module defined in trig.rb file

module Trig
   PI = 3.141592654
   def Trig.sin(x)
   # ..
   end
   def Trig.cos(x)
   # ..
   end
end

我們可以使用相同的函式名稱但功能不同的定義另一個模組 -

#!/usr/bin/ruby

# Module defined in moral.rb file

module Moral
   VERY_BAD = 0
   BAD = 1
   def Moral.sin(badness)
   # ...
   end
end

與類方法一樣,每當您在模組中定義方法時,您都指定模組名稱,後跟一個點,然後是方法名稱。

Ruby require 語句

require 語句類似於 C 和 C++ 的 include 語句以及 Java 的 import 語句。如果第三個程式想要使用任何已定義的模組,它只需使用 Ruby 的require語句載入模組檔案 -

語法

require filename

這裡不需要在檔名後面加上.rb副檔名。

示例

$LOAD_PATH << '.'

require 'trig.rb'
require 'moral'

y = Trig.sin(Trig::PI/4)
wrongdoing = Moral.sin(Moral::VERY_BAD)

這裡我們使用$LOAD_PATH << '.'讓 Ruby 知道必須在當前目錄中搜索包含的檔案。如果您不想使用 $LOAD_PATH,則可以使用require_relative從相對目錄中包含檔案。

重要 - 這裡,這兩個檔案都包含相同的函式名稱。因此,這將導致在包含呼叫程式時程式碼出現歧義,但模組避免了這種程式碼歧義,並且我們能夠使用模組名稱呼叫相應的函式。

Ruby include 語句

您可以將模組嵌入到類中。要將模組嵌入到類中,您可以在類中使用include語句 -

語法

include modulename

如果模組是在單獨的檔案中定義的,則需要在將模組嵌入到類中之前使用require語句包含該檔案。

示例

考慮以下在support.rb檔案中編寫的模組。

module Week
   FIRST_DAY = "Sunday"
   def Week.weeks_in_month
      puts "You have four weeks in a month"
   end
   def Week.weeks_in_year
      puts "You have 52 weeks in a year"
   end
end

現在,您可以按如下方式將此模組包含在類中 -

#!/usr/bin/ruby
$LOAD_PATH << '.'
require "support"

class Decade
include Week
   no_of_yrs = 10
   def no_of_months
      puts Week::FIRST_DAY
      number = 10*12
      puts number
   end
end
d1 = Decade.new
puts Week::FIRST_DAY
Week.weeks_in_month
Week.weeks_in_year
d1.no_of_months

這將產生以下結果 -

Sunday
You have four weeks in a month
You have 52 weeks in a year
Sunday
120

Ruby 中的 Mixin

在閱讀本節之前,我們假設您瞭解面向物件的概念。

當一個類可以從多個父類繼承特徵時,該類應該表現出多重繼承。

Ruby 不直接支援多重繼承,但 Ruby 模組還有另一種奇妙的用途。它們一舉消除了對多重繼承的需求,提供了名為Mixin的功能。

Mixin 為您提供了一種非常可控的方式來向類新增功能。但是,當 Mixin 中的程式碼開始與使用它的類中的程式碼互動時,它們的真正威力就會顯現出來。

讓我們檢查以下示例程式碼以瞭解 Mixin -

module A
   def a1
   end
   def a2
   end
end
module B
   def b1
   end
   def b2
   end
end

class Sample
include A
include B
   def s1
   end
end

samp = Sample.new
samp.a1
samp.a2
samp.b1
samp.b2
samp.s1

模組 A 包含方法 a1 和 a2。模組 B 包含方法 b1 和 b2。類 Sample 包含模組 A 和 B。類 Sample 可以訪問所有四個方法,即 a1、a2、b1 和 b2。因此,您可以看到類 Sample 從這兩個模組繼承。因此,您可以說類 Sample 顯示多重繼承或Mixin

廣告

© . All rights reserved.