7
module A
def self.func
puts "func"
end
end
>> A.func
func
>> A::func
func
爲什麼.
和::
都存在?爲什麼不只是.
?爲什麼Ruby中存在兩種訪問模塊函數的方法?
module A
def self.func
puts "func"
end
end
>> A.func
func
>> A::func
func
爲什麼.
和::
都存在?爲什麼不只是.
?爲什麼Ruby中存在兩種訪問模塊函數的方法?
範圍解析運算符(::
)可以解析常量,實例方法和類方法,因此只要我們在正確的位置查找,我們就可以基本上使用該運算符。由於方法「func」被定義爲模塊A的類方法(由類似於「靜態」方法的self.func
),它直接屬於模塊(它本身就是一個對象),所以它可以是用模塊作爲接收器的點運算符調用。需要注意的是模塊A的情況下,沒有任何知名度,以「功能」,因爲它是一個類的方法:如果該方法被定義爲實例方法,那麼它只能用點操作上調用
aye = Object.new.extend(A)
aye::funC# raises NoMethodError
aye.func # raises NoMethodError
模塊的實例。
module B
def func2
puts "OK!"
end
end
B::func2 # raises NoMethodError
B.func2 # raises NoMethodError
bee = Object.new.extend(B)
bee::func2 # "OK!"
bee.func2 # "OK!"
@RHSeeger,因爲Ruby是一種後現代語言:不一定只有一種方法可以完成某件事情(甚至可以認爲它有多個)。最低限度的語言核心,就像在C,Java和C中一樣,在Ruby中並不真正起作用。 –
@Wayne:刪除了我的評論,因爲我誤解並歪曲了實際問題的內容。當真正的問題是「爲什麼都有,因爲它們是同一件事」時,我把它看作「有什麼區別」。雖然我不確定maerics的答案能夠清楚地回答這個問題,但我的評論並不合適。 – RHSeeger
作爲一個隨機的珍聞,我堅定地認爲「後現代」是一種標記編程語言的不好方法。我將Ruby稱爲現代編程語言,這意味着它利用了編程語言設計中的許多發展來創建易於使用和表達(易於維護)的東西。這就是說,Ruby沒有任何真正的革命性。我喜歡這門語言,並認爲它是來自其他語言的功能的完美結合,但我想不出任何它帶來的東西,這是以前的語言的飛躍。 – RHSeeger