2011-09-25 13 views
6

私はRubyインタプリタがどのように実装されているかを研究していましたが、私にはまだ回答が得られなかった1つの質問が発生しました。それはClassオブジェクト(r_cClass)に1つのメソッドを送信すると、実際にはsuperがメタクラスのr_cClassであるため、(r_cClass)はそれ自身に設定されていますClass 'クラス。しかし、Class 'クラスはClassですので、Classのインスタンスメソッドを見てみるといいでしょうか?しかし、ドキュメントではClassクラスメソッドとClassインスタンスメソッドが分離されているので、そうではありません。 Rubyのsearch_methodeval.cには、Classクラスの特別なチェックはありませんでした。誰かがこれについていくつかの光を当てることができますか?ClassはどのようにClassクラスになり、Classインスタンスメソッドを持たないのですか?

+0

このように抽象的な質問では、インスタンスメソッドの例やクラスメソッドの例など、具体的な例を挙げることをお勧めします。 –

答えて

3

あなたの考え方はうまくいくはずですが、私はそのようにはうまくいかないとは思っていません。ルビー1.8.7において

irb> a = Class.new.methods - Object.new.methods 
=> [... 36 element array ...] 
irb> b = Class.methods - Object.new.methods 
=> [... 37 element array ...] 
irb> b - a 
=> ["nesting"] 

正常クラスインスタンス(Class.new)は36のインスタンスメソッドを有します。 Classクラスのインスタンス(通常のクラスインスタンスでもある)を見ると、36個のインスタンスメソッドと1つの追加のクラスメソッド(ネスト)があります。これはスーパークラスモジュールから継承されているためです。

クラスにインスタンスメソッドを追加すると、クラスメソッドとして自動的に追加されますが、クラスのメタクラスにクラスを追加することはできません。

irb> class Class ; def everywhere ; true ; end ; end 
irb> class << Class ; def only_singleton ; true ; end ; end 
irb> Class.everywhere 
=> true 
irb> Class.new.everywhere 
=> true 
irb> Class.only_singleton 
=> true 
irb> Class.new.only_singleton 
NoMethodError: undefined method 'only_in_singleton' for #<Class:0x4800ac8> 
+0

したがって、実際にはメソッドは同じです。実際には、この考えに私を導いたソースコードには手がかりがありません。 Rubyのドキュメントでは、クラスインスタンスメソッドとクラスシングルトンメソッドを明確に区別しているだけです。その分離は分かりやすくするためだけですか? – eugeniodepalo

+0

シングルトンメソッドとは、クラスメソッドを意味しますか? – rdvdijk

+0

はい、クラスメソッドを意味します。 – eugeniodepalo

関連する問題