[ruby-list:50615] Re: [質問] メタプログラミングRuby(第1版)の include時の無名クラス という記載について
From:
Koichi Sasada <ko1@...>
Date:
2017-12-05 01:36:45 UTC
List:
ruby-list #50615
On 2017/12/05 0:28, Shugo Maeda wrote:
> 2017年12月3日 22:21 モコあき <mokoriso@gmail.com>:
>> Rubyの内部事情(?)をメタプログラミングRuby(第1版)がそのように表現しただけで、実際にアクセス出来るような代物ではない
>> => その無名クラスへのアクセスは諦めてください
>
> 実装の都合で用意されている内部的なオブジェクトなので普通の方法ではアクセスできません。
普通じゃ無い方法その2です。
`ObjectSpace.internal_class_of` を使うと、見るだけは見ることができます。
```
require 'objspace'
module M0
end
module M1_0
end
module M1
include M1_0
end
class C
include M0
include M1
end
class Module
def internal_ancestors
m = self
ary = []
while m
if m.kind_of? ObjectSpace::InternalObjectWrapper
ary << [m, ObjectSpace.internal_class_of(m)]
else
ary << m
end
m = ObjectSpace.internal_super_of(m)
end
ary
end
end
p C.ancestors
p C.internal_ancestors
```
--
// SASADA Koichi at atdot dot net