[ruby-list:50612] [質問] メタプログラミングRuby(第1版)の include時の無名クラス という記載について

From: モコあき <mokoriso@...>
Date: 2017-12-03 13:55:21 UTC
List: ruby-list #50612
モコあきと申します

アーカイブを確認したら文字化けしており、意識してプレーンテキストで送らなければいけなかったのだろうか?と思い、再送信致しました。もし文字化けせずに重複してメールが届いていた場合には大変申し訳ありません
このメーリングリストに質問をするなんてそんな大それた事を・・と思っていましたが、ぐぐってもどうにも解らず勇気を出して質問させて頂こうと思いました。お手柔らかにお願い致します


メタプログラミング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版)の件の文章についてご教示頂けませんでしょうか?
よろしくお願い致します

In This Thread

Prev Next