Project

General

Profile

Actions

Bug #616

closed

instance_eval and Module#to_s

Added by shyouhei (Shyouhei Urabe) about 16 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.2dev (2009-10-19 trunk 25399) [x86_64-freebsd7.2]
Backport:
[ruby-dev:36672]

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


Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #1982: Kernel.load(..., true) --> scope problemClosedmatz (Yukihiro Matsumoto)08/23/2009Actions
Actions #1

Updated by rogerdpack (Roger Pack) about 16 years ago

=begin
which is the preferred way then? :)
=end

Actions #2

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

Actions #3

Updated by yugui (Yuki Sonoda) almost 16 years ago

  • Target version set to 1.9.1 Release Candidate

=begin

=end

Actions #4

Updated by yugui (Yuki Sonoda) almost 16 years ago

  • Assignee changed from matz (Yukihiro Matsumoto) to ko1 (Koichi Sasada)

=begin

=end

Actions #5

Updated by yugui (Yuki Sonoda) almost 16 years ago

  • Due date set to 12/24/2008

=begin

=end

Actions #6

Updated by yugui (Yuki Sonoda) almost 16 years ago

  • Assignee changed from ko1 (Koichi Sasada) to yugui (Yuki Sonoda)

=begin

=end

Actions #7

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

Actions #8

Updated by yugui (Yuki Sonoda) almost 16 years ago

=begin
私がとりあえず見てみます。手に負えなかったら笹田さんに振ります。
=end

Actions #9

Updated by yugui (Yuki Sonoda) almost 16 years ago

=begin
これは単純に、instance_evalやmodule_evalではcrefを積んじゃいけないということなんですが、今はyield_uderで積むようになってます。

これを取り除くと今度はメソッド定義先が切り替わらないようです。スタックの全体像を把握してないんですが、定数スコープスタックと、メソッド定義スコープスタックが統合されてますか?
=end

Actions #10

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

Actions #11

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

Actions #12

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 writes:

| これは,次の2つの問題に分けられます.
|
|(1) instance_eval{} 実行中の定数の定義先
|(2) 特異クラスコンテキスト中で定義されたクラス名
|
| (1) は 1.9 の非互換,(2) は 1.8 からあった問題です.

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

こっちには書いてませんでしたが、(1)は1.9での仕様変更とします。

=end

Actions #13

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

Actions #14

Updated by yugui (Yuki Sonoda) almost 16 years ago

  • Target version changed from 1.9.1 RC2 to 1.9.2

=begin

=end

Actions #15

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

Actions #16

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 writes:

|これの (2) って結局どうするんですか

どうしましょうね。挙動としては

  • 名前がない時にはObjectから定数をたぐってクラスを探す
  • 見つかったら、名前として登録する

という振る舞いをしているのですが、特異クラスには名前がありま
せんから、上記の探索で見つからず、名前がつかないということで
す。これはしょうがない気がします。ということで、放置に気持ち
が傾いてます。

一方、class文で定義した場合には

#Class:0x8caf000::Foo

のような名前が定義されちゃうわけですが、これはこれで気持ちが
悪いですねえ。

この辺も含めて考えると、

  • 現在の名前(パス)を、名前と親のパスに分離
  • 親にパスが(まだ)ない場合、パスの生成を遅延

とかも考えられないこともないのですが、コストに見合うかどうか。

                             まつもと ゆきひろ /:|)

=end

Actions #17

Updated by mame (Yusuke Endoh) over 14 years ago

  • Status changed from Open to Closed

=begin
遠藤です。

2008年12月29日12:38 SASADA Koichi :

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
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0