From: Makoto Inada Date: 2007-02-17T15:08:57+09:00 Subject: [ruby-dev:30368] Re: class local instance variable ------=_Part_16712_24619848.1171692533235 Content-Type: text/plain; charset=ISO-2022-JP; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline はじめまして。いなだと申します。 insntance_eval の方は調べてないんですが、特異クラスで定義されたメソッドから、クラスローカルインスタンス変数が見えません。サンプルコードを添付しておきました。1.9.02007-02-16 で動作確認しています。 オブジェクト独自のメソッドである特異メソッドは、オブジェクトのインスタンス変数のすべてにアクセスできるべきであるというのが正しいなら、クラスローカルインスタンス変数へもアクセスできるべきです。 一方で、「クラスローカル」を字義どおりに解釈するなら、特異メソッドはオブジェクトの一部とはみなせてもクラスの一部とは見なせないので、クラスローカルインスタンス変数にアクセスできないというのも理屈です。 この二つは両立しないんですが、どちらの解釈が正しいんでしょうか?個人的には前者の方が直感的で好みです。 class C def initialize @_ccc = 47 end def f @_ccc end end a = C.new class << a def g @_ccc end end p a.f # <-- 47 p a.g # <-- nil On 2/16/07, Nobuyoshi Nakada wrote: > > なかだです。 > > At Sat, 17 Feb 2007 02:18:00 +0900, > Park Ji-In wrote in [ruby-dev:30363]: > > 何かinstance_evalの中ではちょっとivar2が違うような気がします > > があれが間違ったとすれば、@__x__/Merong となるように直したら > > Singletonも元のコードで動くと思います。 > > ivar2が違うのは確かなのですが、単にそれだけではすまないのではな > いかと思います。たぶん、Singletonが動くようになればその表示も期 > 待されるようにはなるでしょうが。 > > とりあえず分かっていることは、 > * instance_eval中と特異メソッド中ではget_cref()の戻り値が違う > * 前者ではlfp_get_special_cref()が有効だが後者では無効 > くらい。もしかしたら、特異メソッド定義の際にcrefをpushするだけ > でもいいかもしれませんが、あるいは定数探索と共通にしていること > が問題なのかも。 > > -- > --- 僕の前にBugはない。 > --- 僕の後ろにBugはできる。 > 中田 伸悦 > > ------=_Part_16712_24619848.1171692533235 Content-Type: text/html; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Content-Disposition: inline はじめまして。いなだと申します。

insntance_eval の方は調べてないんですが、特異クラスで定義されたメソッドから、クラスローカルインスタンス変数が見えません。サンプルコードを添付しておきました。1.9.0 2007-02-16 で動作確認しています。

オブジェクト独自のメソッドである特異メソッドは、オブジェクトのインスタンス変数のすべてにアクセスできるべきであるというのが正しいなら、クラスローカルインスタンス変数へもアクセスできるべきです。
一方で、「クラスローカル」を字義どおりに解釈するなら、特異メソッドはオブジェクトの一部とはみなせてもクラスの一部とは見なせないので、クラスローカルインスタンス変数にアクセスできないというのも理屈です。
この二つは両立しないんですが、どちらの解釈が正しいんでしょうか?個人的には前者の方が直感的で好みです。


class C
  def initialize
    @_ccc = 47
  end
 def f
    @_ccc
  end
end

a = C.new

class << a
  def g
    @_ccc
  end
end

p a.f    # <-- 47
p a.g   # <-- nil


On 2/16/07, Nobuyoshi Nakada <nobu@ruby-lang.org> wrote:
なかだです。

At Sat, 17 Feb 2007 02:18:00 +0900,
Park Ji-In wrote in [ruby-dev:30363]:
> 何かinstance_evalの中ではちょっとivar2が違うような気がします
> があれが間違ったとすれば、@__x__/Merong となるように直したら
> Singletonも元のコードで動くと思います。

ivar2が違うのは確かなのですが、単にそれだけではすまないのではな
いかと思います。たぶん、Singletonが動くようになればその表示も期
待されるようにはなるでしょうが。

とりあえず分かっていることは、
* instance_eval中と特異メソッド中ではget_cref()の戻り値が違う
* 前者ではlfp_get_special_cref()が有効だが後者では無効
くらい。もしかしたら、特異メソッド定義の際にcrefをpushするだけ
でもいいかもしれませんが、あるいは定数探索と共通にしていること
が問題なのかも。

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦


------=_Part_16712_24619848.1171692533235--