[#30408] Ruby 1.8.6 preview2 has been released — "Akinori MUSHA" <knu@...>

 Ruby 1.8.6 preview2 をリリースしました。

20 messages 2007/02/24
[#30414] fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Hidetoshi NAGAI <nagai@...> 2007/02/25

永井@知能.九工大です.

[#30418] Re: fail to autoload at $SAFE==4 (Re: Ruby 1.8.6 preview2 has been released) — Nobuyoshi Nakada <nobu@...> 2007/02/25

なかだです。

[ruby-dev:30397] Re: class local instance variable

From: Yukihiro Matsumoto <matz@...>
Date: 2007-02-22 01:12:44 UTC
List: ruby-dev #30397
まつもと ゆきひろです

ちょっと考えたんですが、まだ納得できる結論が出ていません。

In message "Re: [ruby-dev:30382] Re: class local instance variable"
    on Sun, 18 Feb 2007 12:23:18 +0900, "Makoto Inada" <mak@robustatech.com> 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 <<Foo
  def foo_c2
    @_foo  # (3)
  end
end

def Foo.foo_c3
  @_foo    # (4)
end

foo = Foo.new

def foo.foo_i1
  @_foo    # (5)
end

class <<foo
  def.foo_i2
    @_foo  # (6)
  end
end

foo.instance_eval {
  def foo_i3
    @_foo  # (7)
  end
}

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

In This Thread