こんにちは。前回の質問ではお世話になりました。
前回同様に、メタプログラミングRuby を読んでいて疑問に思ったことの質問です。
以下は、同著P.201 「5.7 フックメソッド」からの引用です。
lang
1以下のプログラムはクラスがStringを継承したときに画面にその通知を印字するものだ。 2 3 class String 4 def self.inherited(subclass) 5 puts "#{self}は#{subclass}に継承された" 6 end 7 end 8 9 class MyString < String; end 10 11⇒ StringはMyStringに継承された 12 13 inherited()メソッドはClassのインスタンスメソッドで、クラスが継承されたとき 14にRubyが呼び出してくれる。デフォルトのClass#inherited()は何もしない。
疑問は、上記の説明文中の
lang
1inherited()メソッドはClassのインスタンスメソッドで、
の部分です。
説明にあるとおり、inherited()
メソッドがClass
のインスタンスメソッドであるならば、
lang
1Class.instance_methods
で得られる配列の中に要素として、シンボル :inherited
があるのだろうなと思いまして、
以下を実行して、irbから確かめてみました。
lang
1[vagrant@vagrant-centos65 ~]$ ruby -v 2ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux] 3[vagrant@vagrant-centos65 ~]$ irb 4Welcome to IRB. You are using ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]. Have fun ;) 5irb(main):001:0> Class.instance_methods.grep /inherited/ #=> []
上記の最後の行のように、Class.instance_methods.grep /inherited/
が空の配列を返しており、
Class.instance_methods
の中に、:inherited
が無いことが分かりました。
そこで質問なのですが、inherited
メソッドは、何らかのクラスに対する、何らかのメソッド一覧
取得メソッドで得られる配列の中には、現われてくるものなのでしょうか?
もしくは、私が
「inherited()メソッドがClassのインスタンスメソッドであるならば、Class.instance_methodsで
得られる配列の中にinheritedがあるだろう」
と考えたことが間違いなのでしょうか?
よろしくご教示ください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/09/22 22:58