7 1 模組 7 2 命名空間

2021-08-22 06:51:20 字數 2510 閱讀 2087

7.1  模組

我們常常把許多零散的小物件放在乙個盒子裡,或者放在乙個抽屜裡,這些小物件可能是鉛筆,墨水,字典等學習用品,也有可能是不相關的幾件物品。在程式中,相關的、不相關的**的組合,叫作模組。一般情況下,我們總是把功能相關的**放在乙個模組裡。

把功能相關的程式**放在乙個模組裡,體現了模組的第乙個作用:可以被其它程式**重複使用。

看程式 e7.1-1.rb :

ruby **

#e7.1-1.rb  

puts  math.sqrt(2)   # =>  1.4142135623731

puts  math::pi      # =>  3.14159265358979

ruby標準包裡的 math 模組提供了許多方法,比如:求平方根 sqrt ,使用的時候要這麼寫:模組名.方法名(引數)。你可以 math.sqrt(37.2/3) ,math.sqrt( a*5+b ) ;  math 模組還提供了兩個常量,圓周率π 和自然對數底 e,使用的時候要這麼寫:模組名::常量名。

數學中常用的函式,math模組都提供了。每個使用math模組的程式設計師無須再重複編寫這些常用的函式與常數。

定義模組用module...end 。模組與類非常相似,但是:

a) 模組不可以有例項物件;

b) 模組不可以有子類。

7.2  命名空間

如果你覺得ruby標準包裡的math模組提供的sqrt方法不好,不能夠設定迭代區間和精度,你重寫了乙個sqrt方法。你的同事在他的程式裡需要呼叫你的sqrt方法,也要呼叫標準math模組提供的sqrt方法,怎麼辦呢?

模組的第二個作用:提供了乙個命名空間(namespace),防止命名衝突。

看程式 e7.2-1.rb :

呼叫乙個模組方法,與定義模組方法一樣,要在方法名前加上模組名和乙個點號「.」。模組方法提供了乙個途徑,在模組的外部訪問模組內部方法,無須 include 模組。定義模組常量不需要如此。

ruby ** 

#e7.2-1.rb  

module  me   

def sqrt(num, rx=1, e=1e-10)   

num*=1.0   

(num - rx*rx).abs 

endend

include math   

puts   sqrt(293)           # =>  17.1172427686237

#puts   sqrt(293, 5, 0.01)                

include me                           

puts   sqrt(293)           # =>  17.1172427686237                      

puts   sqrt(293, 5, 0.01)    # =>  17.1172429172153         

如你所見,只要include模組名,就能使用不同模組的sqrt方法,math模組的sqrt方法不能有三個引數,me模組的sqrt方法可以是乙個引數,或者二個引數,或者三個引數。me模組被include 在math模組後面,math模組的sqrt方法就被me模組的sqrt方法覆蓋了。

現在出現乙個問題,你喜歡像math模組那樣呼叫sqrt方法,

puts   math.sqrt(2)

而不喜歡像me模組那樣呼叫sqrt方法,

include me

puts   sqrt(2)

還記得類方法嗎?我們可以定義乙個模組方法,在方法名前加上模組名和乙個點號「.」。

看程式 e7.2-2.rb :

ruby **

#e7.2-2.rb 

module me   

def sqrt(num, rx=1, e=1e-10)   

num*=1.0   

(num - rx*rx).abs 

endend

module me2   

def me2.sqrt(*num)   

"this is text sqrt. "

endpi=3.14   

endputs   math.sqrt(1.23)   # => 1.10905365064094

puts   math::pi         # => 3.14159265358979

puts    me2.sqrt(55, 66, 77, 88, 99)  # => this is text sqrt.

puts    me2::pi                  # => 3.14

include me   

puts   sqrt(456, 7, 0.01)   # => 21.3541565188558

呼叫乙個模組方法,與定義模組方法一樣,要在方法名前加上模組名和乙個點號「.」。模組方法提供了乙個途徑,在模組的外部訪問模組內部方法,無須 include 模組。定義模組常量不需要如此。

完整閱讀,請看我寫的 ruby語言中文教程all in one 

六 模組及命名空間

官網文件位址 模組我們可以把一些公共的功能單獨抽離成乙個檔案作為乙個模組。模組裡面的變數 函式 類等預設時私有的,如果我們要在外部訪問模組裡面的資料 變數 函式 類 我們需要通過export暴露模組裡面的資料 變數 函式 類 暴露後我們通過import引入模組就可以使用模組裡面暴露的資料 變數 函式...

Ruby的根模組命名空間

如果你要定製rails的違例輸出頁面的話的,一般會用這樣的 code def rescue action in public exception case exception when actioncontroller unknownaction render with layout when ac...

python模組加強和命名空間

pip使用 安裝包pip install 包名 最新版本 pip install 包名 1.0.4 指定版本 pip install 包名 1.0.4 最小版本 公升級包pip install upgrade 包名 解除安裝包pip uninstall 包名 搜尋包pip search 包名 列出已...