ささだです.
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