1. 程式人生 > >雷林鵬分享:Ruby 模組(Module)

雷林鵬分享:Ruby 模組(Module)

  Ruby 模組(Module)

  模組(Module)是一種把方法、類和常量組合在一起的方式。模組(Module)為您提供了兩大好處。

  模組提供了一個名稱空間和避免名字衝突。

  模組實現了 mixin 裝置。

  模組(Module)定義了一個名稱空間,相當於一個沙箱,在裡邊您的方法和常量不會與其他地方的方法常量衝突。

  語法

  module Identifier

  statement1

  statement2

  ...........

  end

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

  通過類方法,您可以在類方法名稱前面放置模組名稱和一個點號來呼叫模組方法,您可以使用模組名稱和兩個冒號來引用一個常量。

  例項

  #!/usr/bin/ruby

  # 定義在 trig.rb 檔案中的模組

  module Trig

  PI = 3.141592654

  def Trig.sin(x)

  # ..

  end

  def Trig.cos(x)

  # ..

  end

  end

  我們可以定義多個函式名稱相同但是功能不同的模組:

  #!/usr/bin/ruby

  # 定義在 moral.rb 檔案中的模組

  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 中的 Mixins

  在閱讀本節之前,您需要初步瞭解面向物件的概念。

  當一個類可以從多個父類繼承類的特性時,該類顯示為多重繼承。

  Ruby 不直接支援多重繼承,但是 Ruby 的模組(Module)有另一個神奇的功能。它幾乎消除了多重繼承的需要,提供了一種名為 mixin 的裝置。

  Mixins 向您提供了一種完美的為類新增功能的控制方式。但是,它們真正的強大在於當 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 。(編輯:雷林鵬 來源:網路)