2011-10-27 9 views
0

最近、Rubyでのクラスに関する詳細を調べていて、クラス定義で混乱していました。 RubyでRubyでのクラス定義について

、次のようにクラス定義は、

class A 
    def self.my_method 
    end 
end 

あり、私は混乱していた

class A 
    class << self 
     def my_method 
     end 
    end 
end 

と同じです。第1の場合、selfは現在オブジェクトを使用しているポインタへのポインタとみなすことができ、コンテキストの現在のクラスはAです。メソッドルックアップは再帰的に行われます。しかし、私の質問は、defは何ですか?現在のオブジェクトとコンテキストをどのように変更しますか?問題は2番目のケースでも同じです。 クラス< <自己のような記述は、現在のオブジェクトとコンテキストをどのように変更しますか?

そして別の質問です。私が知る限り、すべてのClassオブジェクトは同じ定義を持つ同じClassオブジェクトを共有するため、フライウェイトのようなデザインパターンに従っています。それで、固有クラスが混乱しました。固有クラスのdefは実際にClassオブジェクトを持つメソッドを定義するので、 "def self。*"にどのように関連付けることができますか?

外から見ると複雑すぎて、Rubyのデザインの詳細が必要な場合があります。

+1

実際に私はあなたの混乱を受けていません... selfはシングルトンクラスのインスタンスですので、 'def self.foobar'はクラスメソッドを宣言し、' def foobar'はselfが現在のインスタンスであるインスタンスメソッドを宣言します。あなたの場合については ...どちらも同じではないでしょうか? (あなたはクラスメソッドを宣言しています) – robustus

+2

これはおそらく役立ちます:http://stackoverflow.com/questions/1630815/why-isnt-the-eigenclass-equivalent-to-self-class-when-it-looks-so-similar/ 1631005#1631005 –

答えて

4
class A 
    # self here is A 
    def aa 
    # self here is the instance of A who called this method 
    end 
    class << self 
    # self is the eigenclass of A, a pseudo-class to store methods to a object. 
    # Any object can have an eigenclass. 
    def aa 
     # self is the pseudo-instance of the eigenclass, self is A. 
    end 
    end 
end 

これは同じです:

class A 
    def self.aa 
    end 
end 

そして、この:

class << A 
    def aa 
    end 
end 

そしてまた、この:

def A.aa 
end 

あなたは何のeigenclassを開くことができます。

hello = "hello" 
class << hello 
    def world 
    self << " world" 
    end 
end 
hello.world #=> "hello world" 
"my".world #=> NoMethodError 

実際に固有クラスはClassのインスタンスですが、独自の固有クラスも持っています。

"混乱するように思えば、クラスがオブジェクトであり、そのオブジェクトがクラスであることを覚えておいてください。"

+2

最後の文が私に影響を与えました。ありがとう! – Davidsun

関連する問題