Ruby 使用手冊

模組 Modules

Ruby 的模組 (module) 與類別相似,除了:

其實⋯⋯模組的 Module 類別正是類別的 Class 類別的父類別。懂嗎?不懂?繼續看下去吧。

模組有兩種用法, 一種將各式相關的方法與常數 (constant)收集在一起(編註:即做為 Namespace 用途)。例如 Math 模組在 Ruby 的標準程式庫 (standard library):

ruby> Math.sqrt(2)
   1.41421
ruby> Math::PI
   3.14159

:: 運算子會通知 Ruby 直譯器,應向哪個模組查詢常數的值(Math 以外的模組可能因為 PI 而具有其他意義)。如果想直接存取模組內的方法或常數而不需要使用 ::,可以 include 該模組:

ruby> include Math
   Object
ruby> sqrt(2)
   1.41421
ruby> PI
   3.14159

另一種用法稱為混入 (mixin)。包括 C++ 的一些物件導向程式語言,允許多重繼承 (multiple inheritance),即是繼承自多個父類別。鬧鐘可說是現實生活的多重繼承範例,鬧鐘既屬於時鐘 (clock) 類別,也屬於響鬧器 (buzzer) 類別。

Ruby 並不具有真正的多重繼承,但混入 (mixin) 技巧是不錯的替代品。還記得模組沒有實例也沒有子類別嗎?但如果我們在類別定義中 include 模組,方法就能有效地加入或混入 (mixin) 類別中。

混入 (mixin) 可以看做是一種可以加入各種特性的技巧。例如:一個擁有 each 方法的類別,混入標準程式庫的 Enumerable 模組後,就能使用 sortfind 方法。

模組能為我們提供多重繼承的基本功能,讓我們以簡單的樹狀結構 (tree structure) 顯示類別關係,從而大幅簡化語言實作 (language implementation)(與 Java 設計者的抉擇類似)。

Copyright (c) 2005-2008 Mark Slagell,中文翻譯 Ruby Taiwan 社群

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

A copy of the license is included in the section entitled "GNU Free Documentation License."