2011-02-16 114 views
2

我知道::允許我們訪問模塊中的項目或類中的類級項目,但只有::String是什麼意思?String和:: String有什麼區別?

String =="hi".class::String=="hi".class有什麼區別?

該類定義如下。

類字符串

回答

6

::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中,您需要使用頂級命名空間::顯式引用頂層串。

2

這意味着 「訪問字符串從頂層名字空間常數」。

類字符串可能在某個模塊中定義 - 這將告訴解釋器訪問頂級命名空間中的類。

5

String::String的具體情況下,答案是:大概有從來沒有是有區別的。

在常量X vs ::X的一般情況下,當然。 X可能是A::B::C::XA::B::X或只是X,但::X總是「只是X」,而普通的「X」可能是其中的任何一個。

String雖然是非常重要的,所以沒有人會無意中重新定義它。在不太可能的情況下,定義名爲String的內部類或模塊時,最有可能包含的代碼使用它的意圖而非String,錯誤,對不起,::String

更新:我要補充一點簡單地看到class String; end沒有在這個意義上,我想你的意思定義String類。在Ruby中,類可以重新打開。 class關鍵字可能會或可能不會引入新的類。它可能只是爲現有的行爲添加行爲,如果裏面什麼都沒有,那麼這只是一個沒有操作的行爲。老類的行爲仍然存在,

相關問題