From: SASADA Koichi Date: 2008-12-29T12:38:11+09:00 Subject: [ruby-dev:37640] Re: [Bug #616] instance_eval and Module#to_s  ささだです. 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] > "#" > 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, #]  (1) については,仕様の問題なのでまつもとさんの判断が必要かと思います. (2) は,単にバグじゃないかと思います. -- // SASADA Koichi at atdot dot net