Bug #616
closedinstance_eval and Module#to_s
Added by shyouhei (Shyouhei Urabe) about 16 years ago. Updated over 13 years ago.
Description
=begin
以下のように、クラスの名前が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"
=end
Updated by rogerdpack (Roger Pack) about 16 years ago
=begin
which is the preferred way then? :)
=end
Updated by shyouhei (Shyouhei Urabe) about 16 years ago
=begin
The latter (1.8 behavior). That one-liner definitely assignes a Class.new to a constant C
(wherever that constant belongs to), so that assignment should take effect I think.
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
- Target version set to 1.9.1 Release Candidate
=begin
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
- Assignee changed from matz (Yukihiro Matsumoto) to ko1 (Koichi Sasada)
=begin
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
- Assignee changed from ko1 (Koichi Sasada) to yugui (Yuki Sonoda)
=begin
=end
Updated by akr (Akira Tanaka) almost 16 years ago
=begin
1.8 と 1.9 で、C の定義先が違う。
1.8 ではグローバル。1.9 では main の特異クラスの中に定義される。
% ./ruby -ve 'instance_eval{p((C = Class.new).to_s)};
class << self
p C
end
'
ruby 1.9.1 (2008-12-21 revision 20902) [i686-linux]
"#Class:0x825d5c0"
#Class:0x825d5c0
1.8 が正しい?
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
=begin
私がとりあえず見てみます。手に負えなかったら笹田さんに振ります。
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
=begin
これは単純に、instance_evalやmodule_evalではcrefを積んじゃいけないということなんですが、今はyield_uderで積むようになってます。
これを取り除くと今度はメソッド定義先が切り替わらないようです。スタックの全体像を把握してないんですが、定数スコープスタックと、メソッド定義スコープスタックが統合されてますか?
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
- Due date changed from 12/24/2008 to 01/20/2009
- Assignee changed from yugui (Yuki Sonoda) to ko1 (Koichi Sasada)
- Priority changed from Normal to 3
=begin
=end
Updated by ko1 (Koichi Sasada) almost 16 years ago
=begin
ささだです.
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
=end
Updated by matz (Yukihiro Matsumoto) almost 16 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:37640] Re: [Bug #616] instance_eval and Module#to_s"
on Mon, 29 Dec 2008 12:38:11 +0900, SASADA Koichi ko1@atdot.net writes:
| これは,次の2つの問題に分けられます.
|
|(1) instance_eval{} 実行中の定数の定義先
|(2) 特異クラスコンテキスト中で定義されたクラス名
|
| (1) は 1.9 の非互換,(2) は 1.8 からあった問題です.
| (1) については,仕様の問題なのでまつもとさんの判断が必要かと思います.
こっちには書いてませんでしたが、(1)は1.9での仕様変更とします。
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
- Target version changed from 1.9.1 Release Candidate to 1.9.1 RC2
=begin
=end
Updated by yugui (Yuki Sonoda) almost 16 years ago
- Target version changed from 1.9.1 RC2 to 1.9.2
=begin
=end
Updated by naruse (Yui NARUSE) about 15 years ago
- ruby -v set to ruby 1.9.2dev (2009-10-19 trunk 25399) [x86_64-freebsd7.2]
=begin
これの (2) って結局どうするんですか
=end
Updated by matz (Yukihiro Matsumoto) about 15 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:39521] [Bug #616] instance_eval and Module#to_s"
on Wed, 21 Oct 2009 19:30:25 +0900, Yui NARUSE redmine@ruby-lang.org writes:
|これの (2) って結局どうするんですか
どうしましょうね。挙動としては
- 名前がない時にはObjectから定数をたぐってクラスを探す
- 見つかったら、名前として登録する
という振る舞いをしているのですが、特異クラスには名前がありま
せんから、上記の探索で見つからず、名前がつかないということで
す。これはしょうがない気がします。ということで、放置に気持ち
が傾いてます。
一方、class文で定義した場合には
#Class:0x8caf000::Foo
のような名前が定義されちゃうわけですが、これはこれで気持ちが
悪いですねえ。
この辺も含めて考えると、
- 現在の名前(パス)を、名前と親のパスに分離
- 親にパスが(まだ)ない場合、パスの生成を遅延
とかも考えられないこともないのですが、コストに見合うかどうか。
まつもと ゆきひろ /:|)
=end
Updated by mame (Yusuke Endoh) over 14 years ago
- Status changed from Open to Closed
=begin
遠藤です。
2008年12月29日12:38 SASADA Koichi ko1@atdot.net:
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) の非互換は [ruby-core:26774] での Yehuda の説得により、1.8 の
挙動に戻されたと思います。
これによって、元の卜部さんの問題はすでに解決しています。
(2) の問題は
o = Object.new
class << o
class C; end
D = Class.new
p [C, D] #=> [#Class:0x825657c::C, #Class:0x82564f0]
end
の表示の一貫性のなさが気持ち悪いというだけの話だと思います。
このチケットだと何が問題かわかりにくいので、このチケットは一旦閉じ、
新しくチケットを作りたいと思います。
--
Yusuke ENDOH mame@tsg.ne.jp
=end