Ruby 模塊(Module)

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

  • 模塊提供了一個(gè)命名空間和避免名字沖突。

  • 模塊實(shí)現(xiàn)了 mixin 裝置。

模塊(Module)定義了一個(gè)命名空間,相當(dāng)于一個(gè)沙盒,在里邊您的方法和常量不會(huì)與其他地方的方法常量沖突。

模塊類似與類,但有以下不同:

  • 模塊不能示例化

  • 模塊沒(méi)有子類

  • 模塊只能被另一個(gè)模塊定義

語(yǔ)法

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

模塊常量命名與類常量命名類似,以大寫(xiě)字母開(kāi)頭。方法定義看起來(lái)也相似:模塊方法定義與類方法定義類似。

通過(guò)類方法,您可以在類方法名稱前面放置模塊名稱和一個(gè)點(diǎn)號(hào)來(lái)調(diào)用模塊方法,您可以使用模塊名稱和兩個(gè)冒號(hào)來(lái)引用一個(gè)常量。

在線示例

#!/usr/bin/ruby
 
# 定義在 trig.rb 文件中的模塊
 
module Trig
   PI = 3.141592654
   def Trig.sin(x)
   # ..
   end
   def Trig.cos(x)
   # ..
   end
end

我們可以定義多個(gè)函數(shù)名稱相同但是功能不同的模塊:

在線示例

#!/usr/bin/ruby
 
# 定義在 moral.rb 文件中的模塊
 
module Moral
   VERY_BAD = 0
   BAD = 1
   def Moral.sin(badness)
   # ...
   end
end

就像類方法,當(dāng)您在模塊中定義一個(gè)方法時(shí),您可以指定在模塊名稱后跟著一個(gè)點(diǎn)號(hào),點(diǎn)號(hào)后跟著方法名。

Ruby require 語(yǔ)句

require 語(yǔ)句類似于 C 和 C++ 中的 include 語(yǔ)句以及 Java 中的 import 語(yǔ)句。如果一個(gè)第三方的程序想要使用任何已定義的模塊,則可以簡(jiǎn)單地使用 Ruby require 語(yǔ)句來(lái)加載模塊文件:

語(yǔ)法

語(yǔ)法

require filename

在這里,文件擴(kuò)展名 .rb 不是必需的。

在線示例

$LOAD_PATH << '.'
 
require 'trig.rb'
require 'moral'
 
y = Trig.sin(Trig::PI/4)
wrongdoing = Moral.sin(Moral::VERY_BAD)

在這里,我們使用 $LOAD_PATH << '.' 讓 Ruby 知道必須在當(dāng)前目錄中搜索被引用的文件。如果您不想使用 $LOAD_PATH,那么您可以使用 require_relative 來(lái)從一個(gè)相對(duì)目錄引用文件。

注意:在這里,文件包含相同的函數(shù)名稱。所以,這會(huì)在引用調(diào)用程序時(shí)導(dǎo)致代碼模糊,但是模塊避免了這種代碼模糊,而且我們可以使用模塊的名稱調(diào)用適當(dāng)?shù)暮瘮?shù)。

Ruby include 語(yǔ)句

您可以在類中嵌入模塊。為了在類中嵌入模塊,您可以在類中使用 include 語(yǔ)句:

語(yǔ)法

include modulename

如果模塊是定義在一個(gè)單獨(dú)的文件中,那么在嵌入模塊之前就需要使用 require 語(yǔ)句引用該文件。

在線示例

假設(shè)下面的模塊寫(xiě)在 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

現(xiàn)在,您可以在類中引用該模塊,如下所示:

在線示例

#!/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

這將產(chǎn)生以下結(jié)果:

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

Ruby 中的 Mixins

在閱讀本節(jié)之前,您需要初步了解面向?qū)ο蟮母拍睢?/p>

當(dāng)一個(gè)類可以從多個(gè)父類繼承類的特性時(shí),該類顯示為多重繼承。

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

Ruby 沒(méi)有真正實(shí)現(xiàn)多重繼承機(jī)制,而是采用成為mixin技術(shù)作為代替品。將模塊include到類定義中,模塊中的方法就mix進(jìn)了類中。

讓我們看看下面的示例代碼,深入了解 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 可以訪問(wèn)所有四個(gè)方法,即 a1、a2、b1 和 b2。

因此,您可以看到類 Sample 繼承了兩個(gè)模塊,您可以說(shuō)類 Sample 使用了多重繼承或 mixin 。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清