2013-02-17 23 views
7

について:クラス<<自分はどういう意味ですか?

class Test 
    class << self 
    def hi 
     puts "Hi there" 
    end 
end 

私は私の頭の中でイメージを、次のを思い付いた:

すべてがRubyでオブジェクトなので、クラス自体は、クラスClassのオブジェクトです。 class << selfを呼び出してTestの内側からClass定義を開き、いくつかのインスタンスメソッドを注入します。 TestClassのインスタンスなので、オブジェクトのインスタンスメソッドを呼び出すのと同じ方法でこれらのメソッドを呼び出すことができます:Test.hi。続き

は私の前の文を視覚化するのに役立ちます擬似コードです:

class Class 
    def hi 
     puts “Hi there” 
    end 
end 

Test = Class.new(class Test 
end) 
Test.hi 

私はこの権利を取得していますか?

答えて

4

Aのオブジェクトobjがあるとします。何class << obj; ... end

[A, ...] 

が、それは、その唯一のインスタンスobjをあるクラスBを作成することで、祖先ようobjの祖先の階層でそれを置く:この時点では、objのクラスの祖先の階層がありますobjのクラスの階層は次のようになります。

[B, A, ...] 

あなたがTestのコンテキスト内class << self; ... endを記述する場合、それのボディはその唯一のインスタンスあるクラスになります。その本体内にインスタンスメソッドhiを定義すると、それはそのクラスのインスタンスに適用されます。これはTestです。したがって、あなたはTest.hiを行うことができます。

+0

Rubyは基本的に 'Class'を変更するのではなく、' Class'を継承し、 'hi'メソッドを定義し、' Test'オブジェクトのクラスである匿名クラスを作成しますか? – spacemonkey

+0

はい。そうです。 – sawa

+0

最終的にこれをクラックするニース。ありがとうございました! – spacemonkey

関連する問題