Ruby難しい。この無名クラスは一体何者なんだ...
— 神速 (@sinsoku_listy) 2018年4月30日
class A
class << self
class B
end
end
end
p A.singleton_class.const_get(:B).ancestors
#=> [#<Class:0x00007fe8c203c980>::B, Object, Kernel, BasicObject]
class A class << self class B end end end p A.singleton_class.const_get(:B).ancestors #=> [#<Class:0x00007fe8c203c980>::B, Object, Kernel, BasicObject]
特異クラスの #<Class:A>
とは別に #<Class:0x00007fe8c203c980>
が存在する・・・?
このオブジェクトの招待
Twitterのリプライで教えて頂いた。 どうやら表示が違うだけで Aの特異クラス でした。
僕も気になったので調べてみましたが
— Yuichi Takeuchi (@takeyuweb) 2018年4月30日
Fiddle.dlwrap(A.singleton_class).to_s(16) #=> "9c1f710"
A.singleton_class.const_get(:B).ancestors.first #=> #<Class:0x00000009c1f710>::B
ということで特異クラスのメモリアドレスぽいので、やはり特異クラスでいいみたい
self の様子みてくと A のコンテキストないでないと A の特異クラスと判断してなそうですね。
— えむ。 (@takkanm) 2018年4月30日
$ cat hoge.rb
class A
class << self
p self
class B
p self
end
end
end
$ ruby hoge.rb
#<Class:A>
#<Class:0x00007ff8b40a8a98>::B
試したコード
class A class << self class B end end end p A.singleton_class #=> #<Class:A> p A.singleton_class.const_get(:B).ancestors #=> [#<Class:0x00007fd05b0ec6e8>::B, Object, Kernel, BasicObject] require 'fiddle' p Fiddle.dlwrap(A.singleton_class).to_s(16) #=> "7fd05b0ec6e8"
また1つ、Ruby雑学力が増えた。 しかし、こんなコードは仕事で絶対に会いたくない。