[ruby-list:50611] [質問] メタプログラミングRuby(第1版)の include時の無名クラス という記載について
From:
モコあき <mokoriso@...>
Date:
2017-12-03 13:21:23 UTC
List:
ruby-list #50611
モコあきと申します このメーリングリストに質問をするなんてそんな大それた事を・・と思っていましたが、ぐぐってもどうにも解らず勇気を出して質問させて頂こうと思いました。お手柔らかにお願い致します メタプログラミングRuby(第1版) 60ページに 「モジュールをクラスに(あるいは別のモジュールに)インクルードするとき、Rubyはちょっとしたトリックを使う。無名クラスを作ってモジュールをラップし、継承チェーンに挿入するのだ。」 との記述があります この「include時にモジュールをラップする無名クラス」が参照できるのかどうか についての質問になります インクルードしたClass.ancestors でアクセスしようとしても評価結果の配列内に現れるのはモジュールそのものであり、 その「無名クラス」にアクセスするには全クラスから検索する必要があるのかな?と思い、 ObjectSpace.each_object(Class).to_a にて全クラスが取得できる事を知り、これで件の「無名クラス」が確認できると考え次のようなコードを実行してみました ``` all_class_list1 = ObjectSpace.each_object(Class).to_a module MokoModule end class Moko include MokoModule end all_class_list2 = ObjectSpace.each_object(Class).to_a p all_class_list2 - all_class_list1 #=> [Moko] ``` 期待した結果は => [Moko, 無名クラス] だったのですが => [Moko] しか確認できませんでした また、メタプログラミングRuby(第1版)が出版されたのはRuby1.8〜1.9の時代との事で(32ページに記載) Ruby 1.8.7 Ruby 1.9.3 Ruby 2.5.0 preview1 にてirb上で実行してみましたが、同じ結果でした また、「Rubyはちょっとしたトリックを使う。無名クラスを作って云々」のくだりは、第2版では削除されているようです(あるとすれば31ページ辺り) 別ページに移動されただけかもしれませんが見つけられませんでした おそらく、 Rubyの内部事情(?)をメタプログラミングRuby(第1版)がそのように表現しただけで、実際にアクセス出来るような代物ではない => その無名クラスへのアクセスは諦めてください そもそも検証方法が間違っている => こうすればその無名クラスにアクセスできるよ 辺りなのかなと考えております Rubyの内部事情や歴史、メタプログラミングRuby(第1版)の件の文章についてご教示頂けませんでしょうか? よろしくお願い致します