2011-02-16 10 views
2

私が知っている::は、モジュール内のアイテム、またはクラス内のクラスレベルのアイテムにアクセスすることを可能にしますが、::Stringの意味は何ですか?StringとStringの違いは何ですか?

String =="hi".class::String=="hi".classの違いは何ですか?

クラスは以下のように定義されます。

Stringクラス

エンド

答えて

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::Xの間で確実です。 XA::B::C::XまたはA::B::X、またはちょうどXですが、::Xは常に「ちょうどX」ですが、平野の「X」はそのいずれでもかまいません。

Stringは非常に重要ですが、誰も誤ってそれを再定義することはありません。万が一内部クラスまたはモジュールがStringと定義されている場合は、String、err、::Stringではなく、コードを含むコードを使用する可能性が最も高いです。

アップデート:私は単にclass String; endを見ることは、私はあなたが意味を考える意味でのクラスStringを定義していないことを追加する必要があります。 Rubyでは、クラスを再オープンすることができます。 classキーワードは、新しいクラスを導入する場合と導入しない場合があります。既存のものに振る舞いを加えているだけかもしれませんし、内部に何もなければ、それはただの操作ではありません。古いクラスの振る舞いはまだそこにあります。

関連する問題