[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

In This Thread