ささだです.

Shyouhei Urabe wrote::
> Bug #616: instance_eval and Module#to_s
> http://redmine.ruby-lang.org/issues/show/616
> 
> 起票者: Shyouhei Urabe
> ステータス: Open, 優先度: Normal
> 担当者: Yukihiro Matsumoto, カテゴリ: core
> 
> 以下のように、クラスの名前が1.8と違うことがあるようです。
> 
> % for i in trunk branches/ruby_1_8; do ~/target/$i/bin/ruby -ve 'instance_eval{p((C = Class.new).to_s)}'; done
> ruby 1.9.0 (2008-10-06 revision 17576) [x86_64-linux]
> "#<Class:0x000000007c4c50>"
> ruby 1.8.7 (2008-09-23 revision 17572) [x86_64-linux]
> "C"

 これは,次の2つの問題に分けられます.

(1) instance_eval{} 実行中の定数の定義先
(2) 特異クラスコンテキスト中で定義されたクラス名

 (1) は 1.9 の非互換,(2) は 1.8 からあった問題です.

 (1) は,recv.instance_eval(&b) の場合,1.8 では b のコンテキストに応じ
て定数定義先コンテキストが変わりましたが,1.9 では recv の特異クラスコン
テキストになってしまう,という非互換です.

class C
end

C.instance_eval{
  Const = 1
}

p Const    #=> 1.8: 1
           #=> 1.9: NameError
class << C
  p Const #=> 1 # 1.9, 1.8: 1
end



 (2) は,特異クラスコンテキスト中で Class.new で定義されたクラス名は,
定数に代入されても名前がつきません.

 で,(1) の問題で,特異クラスコンテキストで定義されるので,名前が表示さ
れない,ということになりました.

C = Class.new do
end

class << self
  D = Class.new do
    $D = self
  end
end

p [C, $D] #=> [C, #<Class:0x383f2f4>]


 (1) については,仕様の問題なのでまつもとさんの判断が必要かと思います.
(2) は,単にバグじゃないかと思います.

-- 
// SASADA Koichi at atdot dot net