[ruby-dev:24223] Re: 1.instance_eval "@@a" dumps core

From: Yukihiro Matsumoto <matz@...>
Date: 2004-09-05 11:02:29 UTC
List: ruby-dev #24223
まつもと ゆきひろです

In message "Re: [ruby-dev:24222] Re: 1.instance_eval "@@a" dumps core"
    on Sun, 5 Sep 2004 15:37:05 +0900, Tanaka Akira <akr@m17n.org> writes:

|> あ、しまった。「今の」クラス変数は特異クラスに対して呼ばれる
|> とネストの外側を見に行くのでした。「こうしよう」と思ってる仕
|> 様とごっちゃになってました。修正します。
|
|なぜそういう仕様なんでしょうか?

えーと、実装したのが「あるべき仕様」なんじゃなくて、「ネスト
の外に見に行かない」のが「あるべき仕様」のつもりでした。問題
はそういう条件でもネストの外に見に行かなくてはいけないケース
があることをすっかり忘れて、中途半端なものを実装してしまった
ということです。

|特異クラスではなく普通のクラスのクラス変数にするという仕様もあり得ると
|思うのですが、それに対して予定されている仕様の利点はなんでしょうか?

「予定されている仕様」というのは、instance_evalおよび特異メ
ソッド定義の内側ではネストの1段外側を見る、です。
instance_eval()の場合はその呼び出し地点でのクラス変数の値で
すし、特異メソッド定義の場合は、定義対象のオブジェクトに関ら
ず、それを囲んでいるクラスのクラス定数です。

「普通のクラスのクラス変数」というのは

  1.instance_eval("@@a")

がFixnumクラスのクラス変数を参照するということでしょうか。そ
れはできるだけ静的スコープにしたいという私の希望には反するの
ですが。

  class Fixnum
    @@a = 1
  end
  class Foo
    @@a = 4
    p 1.instance_eval("@@a")
  end

が、1でなく4を出力するのがよいのではないかと思っています。

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

In This Thread