我知道::
允許我們訪問模塊中的項目或類中的類級項目,但只有::String
是什麼意思?String和:: String有什麼區別?
String =="hi".class
和::String=="hi".class
有什麼區別?
該類定義如下。
類字符串
端
我知道::
允許我們訪問模塊中的項目或類中的類級項目,但只有::String
是什麼意思?String和:: String有什麼區別?
String =="hi".class
和::String=="hi".class
有什麼區別?
該類定義如下。
類字符串
端
::String
引用頂級String
類。 String
引用當前名稱空間中的字符串或上面的名稱空間。
看看下面的代碼:
module MyModule
class String
def initialize(s); end
def split(operator=nil)
puts "This string doesn't split"
end
end
class SomeClass
def bar
s = String.new("foo:bar")
s.split(":")
end
def foo
s = ::String.new("foo:bar")
s.split(":")
end
end
end
sc = MyModule::SomeClass.new
sc.foo
=> ["foo", "bar"]
sc.bar
This string doesn't split
=> nil
由於String
中都存在的頂級命名空間和模塊MyModule
中,您需要使用頂級命名空間::
顯式引用頂層串。
這意味着 「訪問字符串從頂層名字空間常數」。
類字符串可能在某個模塊中定義 - 這將告訴解釋器訪問頂級命名空間中的類。
在String
與::String
的具體情況下,答案是:大概有從來沒有是有區別的。
在常量X
vs ::X
的一般情況下,當然。 X
可能是A::B::C::X
或A::B::X
或只是X
,但::X
總是「只是X
」,而普通的「X
」可能是其中的任何一個。
String
雖然是非常重要的,所以沒有人會無意中重新定義它。在不太可能的情況下,定義名爲String
的內部類或模塊時,最有可能包含的代碼使用它的意圖而非String
,錯誤,對不起,::String
。
更新:我要補充一點簡單地看到class String; end
沒有在這個意義上,我想你的意思定義String
類。在Ruby中,類可以重新打開。 class
關鍵字可能會或可能不會引入新的類。它可能只是爲現有的行爲添加行爲,如果裏面什麼都沒有,那麼這只是一個沒有操作的行爲。老類的行爲仍然存在,