私が知っている::
は、モジュール内のアイテム、またはクラス内のクラスレベルのアイテムにアクセスすることを可能にしますが、::String
の意味は何ですか?StringとStringの違いは何ですか?
String =="hi".class
と::String=="hi".class
の違いは何ですか?
クラスは以下のように定義されます。
Stringクラス
エンド
私が知っている::
は、モジュール内のアイテム、またはクラス内のクラスレベルのアイテムにアクセスすることを可能にしますが、::String
の意味は何ですか?StringとStringの違いは何ですか?
String =="hi".class
と::String=="hi".class
の違いは何ですか?
クラスは以下のように定義されます。
Stringクラス
エンド
::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
と::X
の間で確実です。 X
はA::B::C::X
またはA::B::X
、またはちょうどX
ですが、::X
は常に「ちょうどX
」ですが、平野の「X
」はそのいずれでもかまいません。
String
は非常に重要ですが、誰も誤ってそれを再定義することはありません。万が一内部クラスまたはモジュールがString
と定義されている場合は、String
、err、::String
ではなく、コードを含むコードを使用する可能性が最も高いです。
アップデート:私は単にclass String; end
を見ることは、私はあなたが意味を考える意味でのクラスString
を定義していないことを追加する必要があります。 Rubyでは、クラスを再オープンすることができます。 class
キーワードは、新しいクラスを導入する場合と導入しない場合があります。既存のものに振る舞いを加えているだけかもしれませんし、内部に何もなければ、それはただの操作ではありません。古いクラスの振る舞いはまだそこにあります。