[ruby-dev:36672] [Bug #616] instance_eval and Module#to_s

View: New views
11 Messages — Rating Filter:   Alert me  

[ruby-dev:36672] [Bug #616] instance_eval and Module#to_s

by Usaku NAKAMURA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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"


----------------------------------------
http://redmine.ruby-lang.org


[ruby-dev:36981] [Bug #616] instance_eval and Module#to_s

by Usaku NAKAMURA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

チケット #616 が更新されました。 (by Roger Pack)


which is the preferred way then? :)
----------------------------------------
http://redmine.ruby-lang.org/issues/show/616

----------------------------------------
http://redmine.ruby-lang.org


[ruby-dev:36982] [Bug #616] instance_eval and Module#to_s

by Usaku NAKAMURA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

チケット #616 が更新されました。 (by Shyouhei Urabe)


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.
----------------------------------------
http://redmine.ruby-lang.org/issues/show/616

----------------------------------------
http://redmine.ruby-lang.org


[ruby-dev:37534] [Bug #616] instance_eval and Module#to_s

by Usaku NAKAMURA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

チケット #616 が更新されました。 (by Akira Tanaka)


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.9 が正しい?
----------------------------------------
http://redmine.ruby-lang.org/issues/show/616

----------------------------------------
http://redmine.ruby-lang.org


[ruby-dev:37536] Re: [Bug #616] instance_eval and Module#to_s

by Tanaka Akira-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

In article <494ef0c59cd79_87b776bdf611180@...>,
  Akira Tanaka <redmine@...> writes:

> 1.9 が正しい?

う、まちがいです。正しそうなのは 1.8 です。
--
[田中 哲][たなか あきら][Tanaka Akira]


[ruby-dev:37542] [Bug #616] instance_eval and Module#to_s

by Usaku NAKAMURA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

チケット #616 が更新されました。 (by Yuki Sonoda)


私がとりあえず見てみます。手に負えなかったら笹田さんに振ります。
----------------------------------------
http://redmine.ruby-lang.org/issues/show/616

----------------------------------------
http://redmine.ruby-lang.org


[ruby-dev:37614] [Bug #616] instance_eval and Module#to_s

by Usaku NAKAMURA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

チケット #616 が更新されました。 (by Yuki Sonoda)


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

これを取り除くと今度はメソッド定義先が切り替わらないようです。スタックの全体像を把握してないんですが、定数スコープスタックと、メソッド定義スコープスタックが統合されてますか?
----------------------------------------
http://redmine.ruby-lang.org/issues/show/616

----------------------------------------
http://redmine.ruby-lang.org


[ruby-dev:37640] Re: [Bug #616] instance_eval and Module#to_s

by SASADA Koichi :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

 ささだです.

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


[ruby-dev:37644] Re: [Bug #616] instance_eval and Module#to_s

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

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

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

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

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


[ruby-dev:39521] [Bug #616] instance_eval and Module#to_s

by Usaku NAKAMURA :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

チケット #616 が更新されました。 (by Yui NARUSE)

ruby -v ruby 1.9.2dev (2009-10-19 trunk 25399) [x86_64-freebsd7.2] にセット

これの (2) って結局どうするんですか
----------------------------------------
http://redmine.ruby-lang.org/issues/show/616

----------------------------------------
http://redmine.ruby-lang.org


[ruby-dev:39531] Re: [Bug #616] instance_eval and Module#to_s

by Yukihiro Matsumoto :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

まつもと ゆきひろです

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

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

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

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

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

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

  #<Class:0x8caf000>::Foo

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

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

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

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

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