# 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_ 。
- Ruby 基礎
- Ruby 簡介
- Ruby 環境
- Ruby 安裝 - Unix
- Ruby 安裝 - Windows
- Ruby 命令行選項
- Ruby 環境變量
- Ruby 語法
- Ruby 數據類型
- Ruby 類和對象
- Ruby 類案例
- Ruby 變量
- Ruby 運算符
- Ruby 注釋
- Ruby 判斷
- Ruby 循環
- Ruby 方法
- Ruby 塊
- Ruby 模塊(Module)
- Ruby 字符串(String)
- Ruby 數組(Array)
- Ruby 哈希(Hash)
- Ruby 日期 & 時間(Date & Time)
- Ruby 范圍(Range)
- Ruby 迭代器
- Ruby 文件的輸入與輸出
- Ruby File 類和方法
- Ruby Dir 類和方法
- Ruby 異常
- Ruby 高級
- Ruby 面向對象
- Ruby 正則表達式
- Ruby 數據庫訪問 - DBI 教程
- Ruby CGI 編程
- Ruby CGI方法
- Ruby CGI Cookies
- Ruby CGI Sessions
- Ruby 發送郵件 - SMATP
- Ruby Socket 編程
- Ruby XML, XSLT 和 XPath 教程
- Ruby Web Services 應用 - SOAP4R
- Ruby 多線程
- 免責聲明