Project

General

Profile

Bug #616

instance_eval and Module#to_s

Added by shyouhei (Shyouhei Urabe) about 12 years ago. Updated over 9 years ago.

Status:
Closed
Priority:
Normal
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

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

Updated by rogerdpack (Roger Pack) almost 12 years ago

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

#2

Updated by shyouhei (Shyouhei Urabe) almost 12 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

#3

Updated by yugui (Yuki Sonoda) almost 12 years ago

  • Target version set to 1.9.1 Release Candidate

=begin

=end

#4

Updated by yugui (Yuki Sonoda) almost 12 years ago

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

=begin

=end

#5

Updated by yugui (Yuki Sonoda) almost 12 years ago

  • Due date set to 12/24/2008

=begin

=end

#6

Updated by yugui (Yuki Sonoda) almost 12 years ago

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

=begin

=end

#7

Updated by akr (Akira Tanaka) almost 12 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

#8

Updated by yugui (Yuki Sonoda) almost 12 years ago

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

#9

Updated by yugui (Yuki Sonoda) almost 12 years ago

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

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

#10

Updated by yugui (Yuki Sonoda) almost 12 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

#11

Updated by ko1 (Koichi Sasada) almost 12 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

#12

Updated by matz (Yukihiro Matsumoto) almost 12 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

#13

Updated by yugui (Yuki Sonoda) almost 12 years ago

  • Target version changed from 1.9.1 Release Candidate to 1.9.1 RC2

=begin

=end

#14

Updated by yugui (Yuki Sonoda) almost 12 years ago

  • Target version changed from 1.9.1 RC2 to 1.9.2

=begin

=end

#15

Updated by naruse (Yui NARUSE) about 11 years ago

  • ruby -v set to ruby 1.9.2dev (2009-10-19 trunk 25399) [x86_64-freebsd7.2]

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

#16

Updated by matz (Yukihiro Matsumoto) about 11 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

#17

Updated by mame (Yusuke Endoh) over 10 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

Also available in: Atom PDF