From: Yukihiro Matsumoto Date: 2007-02-22T10:12:44+09:00 Subject: [ruby-dev:30397] Re: class local instance variable まつもと ゆきひろです ちょっと考えたんですが、まだ納得できる結論が出ていません。 In message "Re: [ruby-dev:30382] Re: class local instance variable" on Sun, 18 Feb 2007 12:23:18 +0900, "Makoto Inada" writes: |> でも、ここではMerongクラスのローカルインスタンス変数にアクセスできるというのが一般的な期待なんでしょうか。 | |私はそう期待します。プログラムを書いていて instance_eval |を使うときは大抵、既に存在するオブジェクトを直接操作/参照するつもりで書いているので、 | |1. 特異クラスの存在を(たとえ知っていても)意識していない、 |2. そのオブジェクトのインスタンス変数にはすべてアクセスできると思ってしまう、 | |というふうに考えています。 まず、1についてですが、instance_evalでのターゲットとなるクラ スが特異クラスでないとまずい局面は確かにあります。たとえば instance_evalの中でメソッド定義を行った場合、やはり、そのオ ブジェクトのクラスにメソッドが定義されるのではなく、そのオブ ジェクトに特異メソッドが定義されるべきでしょう。 で、クラスローカルインスタンス変数の対象がどうあるべきかとい うのは、現時点では私にはよくわかりません。 というのも、稲田さんの期待の前提となる「そのオブジェクトのイ ンスタンス変数にはすべてアクセスできる」という仮定は、それそ のものがアクセスできる範囲を限定する(ので、名称重複があって も問題にならない)クラスローカルインスタンス変数の存在と矛盾 するからです。それぞれのメソッドはその所属するクラスというも のが存在していて、それをクラスローカルインスタンス変数の所属 先として問題ないのですが、instance_evalでのクラスローカル変 数の所属先を、そのオブジェクトの特異クラスにするのか、そのオ ブジェクトのクラスにするのかは悩ましいところです。 instance_evalの(クラスローカルインスタンス変数の)ターゲット を、そのオブジェクトのクラスにするのは(やや実装が面倒なもの の)不可能ではないのですが、それにどれだけ意味があるのかよく わからないと言うのが正直なところです。 以下の各箇所でのクラスローカルインスタンス変数はどのクラスに 所属すべきだと思いますか? class Foo def foo @_foo # (1) end def self.foo_c1 @_foo # (2) end end class <