eigenclass of eigenclass / superclass of eigenclass

RHGの逆襲の第3回目の予習ってことでさらに class.c をちらちらみながらRHGの4章とすりあわせていたら、なんだか特異クラスの継承関係が 1.8 からけっこう変化していることに気がつきました。

(eigen.rb)
class Object
  def eigenclass
    class << self; self; end
  end
end

class A
end

puts "eigenclass of instance"
a = A.new
p a.eigenclass
puts "superclass"
p a.eigenclass.superclass

puts
puts "eigenclass of class instance"
p A.eigenclass
puts "superclass"
p A.eigenclass.superclass

puts
puts "eigenclass of eigenclass"
p a.eigenclass.eigenclass
p A.eigenclass.eigenclass

ためしに上のようなスクリプトを1.8と1.9(trunk)で実行してみるとこうなりました。

$ ruby -v eigen.rb 
ruby 1.8.5 (2006-08-25) [i686-darwin8.7.1]
eigenclass of instance
#>
superclass
#

eigenclass of class instance
#
superclass
#

eigenclass of eigenclass
#>>
#>

*1

$ ruby-trunk -v eigen.rb 
ruby 1.9.0 (2008-03-26 revision 15580) [i686-darwin8.11.1]
eigenclass of instance
#>
superclass
A

eigenclass of class instance
#
superclass
#

eigenclass of eigenclass
Class
Class

つまり

  1. インスタンスの特異クラスのsuperclassが、インスタンスのクラスの特異クラスからクラスそのものに変化している
  2. クラスインスタンスの特異クラスのsuperclassが、Classクラスの特異クラスから Objectクラスの特異クラスに変化している。
  3. 特異クラスの特異クラス(の特異クラス……)というふうに、特異クラスはいくつでもchainできてたけど、特異クラスの特異クラスはClassになるようになった。

なのですが……、RHGを読むと 1. と 2. は 1.9 の結果のほうが記述と一致しているように思えるんですよね。
a.eigenclass.superclass が a.class.eigenclass (つまり A.eigenclass)だったら、a のメソッド検索から A が抜けてしまうような……。
もしかして Class#superclass かメソッド検索の実装が変化してるのかな。明日もう少し調査してみる予定。

*1:あれ、1.8.6のつもりが1.8.5になってるな……