Re: class local instance variable

e$B$3$s$P$s$O!#KQe(B e$B<G0ue(B e$B$H?=$7$^$9!#e(B
e$B=i$a$F$J$N$G$I$&$+$h$m$7$/$*4j$$$7$^$9!#e(B

e$B<B$O>/$7A0$Ke(Btisphie at
gmaile$B$G=q$$$?$b$N$,e(Barchivee$B$GJQ$K8+$($F$^$9!#e(B
e$BK\Ev$K$9$$^$;$s$G$7$?!#e(Butf-8e$B$N%a!<%k$O$@$a$$?$$$G$9!#2~$a$Fe(Biso-2022-jpe$B$G=q$-$^$9!#e(B(e$B$3$l$b%@%a$J$i$I$&$7$h$&e(B)

e$B<!$N$h$&$Je(Bcodee$B$r<B9T$7$F$_$^$7$?!#e(B
e$B$9$k$H!"e(B

mithrandir@losrorien ~/ruby/ruby-svn/trunk $ cat test2.rb
class Merong
def m
@y = “Yes!”
end

end

m = Merong.new
m.m
m.instance_eval { @x = “Yes!” }
puts m.instance_variables.inspect

mithrandir@losrorien ~/ruby/ruby-svn/trunk $ ./miniruby test2.rb
[:@x/#<Class:#Merong:0xb7ed95c4>, :@y/Merong]

e$B$3$&$J$j$^$7$?!#e(B

e$B2?$+e(Binstance_evale$B$NCf$G$O$A$g$C$He(Bivar2e$B$,0c$&$h$&$J5$$,$7$^$9$,$"$l$,4V0c$C$?$H$9$l$P!"e(B@x/Merong
e$B$H$J$k$h$&$KD>$7$?$ie(BSingletone$B$b85$N%3!<%I$GF0$/$H;W$$$^$9!#e(B
e$B$+$s$A$,$$$@$C$?$i$9$_$^$;$s!#e(B

e$BF|K\8l$,2<<j$G$9!"$9$$^$;$s!#BgL$K$$F$/$@$5$$e(B

e$B$J$+$@$G$9!#e(B

At Sat, 17 Feb 2007 02:18:00 +0900,
Park Ji-In wrote in [ruby-dev:30363]:

e$B2?$+e(Binstance_evale$B$NCf$G$O$A$g$C$He(Bivar2e$B$,0c$&$h$&$J5$$,$7$^$9e(B
e$B$,$"$l$,4V0c$C$?$H$9$l$P!"e(B@x/Merong e$B$H$J$k$h$&$KD>$7$?$ie(B
Singletone$B$b85$N%3!<%I$GF0$/$H;W$$$^$9!#e(B

ivar2e$B$,0c$&$N$O3N$+$J$N$G$9$,!"C1$K$=$l$@$1$G$O$9$^$J$$$N$G$O$Je(B
e$B$$$+$H;W$$$^$9!#$?$V$s!"e(BSingletone$B$,F0$/$h$&$K$J$l$P$=$NI=<($b4|e(B
e$BBT$5$l$k$h$&$K$O$J$k$G$7$g$&$,!#e(B

e$B$H$j$"$($:J,$+$C$F$$$k$3$H$O!"e(B
*
instance_evale$BCf$HFC0[%a%=%C%ICf$G$Oe(Bget_cref()e$B$NLa$jCM$,0c$&e(B

  • e$BA0<T$G$Oe(Blfp_get_special_cref()e$B$,M-8z$@$,8e<T$G$OL58ze(B
    e$B$/$i$$!#$b$7$+$7$?$i!“FC0[%a%=%C%IDj5A$N:]$Ke(Bcrefe$B$re(Bpushe$B$9$k$@$1e(B
    e$B$G$b$$$$$+$b$7$l$^$;$s$,!”$"$k$$$ODj?tC5:w$H6&DL$K$7$F$$$k$3$He(B
    e$B$,LdBj$J$N$+$b!#e(B

はじめまして。いなだと申します。

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

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:30368] Re: class local instance variable”
on Sat, 17 Feb 2007 15:08:57 +0900, “Makoto Inada”
[email protected] writes:

|e$B$O$8$a$^$7$F!#$$$J$@$H?=$7$^$9!#e(B

e$B$=$N@a$O$I$&$b!#e(B

|insntance_eval
|e$B$NJ}$OD4$Y$F$J$$$s$G$9$,!“FC0[%/%i%9$GDj5A$5$l$?%a%=%C%I$+$i!”%/%i%9%m!<%+%k%$%s%9%?%s%9JQ?t$,8+$($^$;$s!#%5%s%W%k%3!<%I$rE:IU$7$F$*$-$^$7$?!#e(B1.9.02007-02-16
|e$B$GF0:n3NG’$7$F$$$^$9!#e(B

e$B$3$l$O;d$N0U?^DL$j$NF0:n$G$9!#e(B

|e$B%%V%8%'%/%HFH<+$N%a%=%C%I$G$“$kFC0[%a%=%C%I$O!”%%V%8%‘%/%H$N%$%s%9%?%s%9JQ?t$N$9$Y$F$K%“%/%;%9$G$-$k$Y$-$G$”$k$H$$$&$N$,@5$7$$$J$i!“%/%i%9%m!<%+%k%$%s%9%?%s%9JQ?t$X$b%”%/%;%9$G$-$k$Y$-$G$9!#e(B
|e$B0lJ}$G!"!V%/%i%9%m!<%+%k!W$r;z5A$I$$j$K2r<a$9$k$J$i!"FC0[%a%=%C%I$O%%V%8%’%/%H$N0lIt$H$O$$J$;$F$b%/%i%9$N0lIt$H$O8+$J$;$J$$$N$G!“%/%i%9%m!<%+%k%$%s%9%?%s%9JQ?t$K%”%/%;%9$G$-$J$$$H$$$&$N$bM}6~$G$9!#e(B
|e$B$3$NFs$D$ON>N)$7$J$$$s$G$9$,!"$I$A$i$N2r<a$,@5$7$$$s$G$7$g$&$+!)8D?ME*$K$OA0<T$NJ}$,D>46E*$G9%$
$G$9!#e(B

e$B%/%i%9%m!<%+%k%$%s%9%?%s%9JQ?t$O!“$=$N%a%=%C%I$,B0$7$F$$$k%/e(B
e$B%i%9$NHO0OFb$G$7$+%”%/%;%9$G$-$J$$%$%s%9%?%s%9JQ?t$G$9!#%%Ve(B
e$B%8%'%/%H$NFC0[%a%=%C%I$,B0$7$F$$$k$N$O!"$=$N%
%V%8%'%/%H$K8Ge(B
e$BM-$NFC0[%/%i%9e(B(singleton class or eigenclass)e$B$G$9$+$i!"$=$Ne(B
e$BHO0OFb$GM-8z$G$9!#e(B

e$B$=$NFC0[%/%i%9$,=jB0$7$F$$$k%%V%8%'%/%H$,!“$?$^$?$^%/%i%9$Ge(B
e$B$”$C$?>l9g$K$O!"$=$A$i$r%/%i%9%m!<%+%k$NBP>]$H$9$k$H$$$&e(B(e$B0pe(B
e$BED$5$s$N$
$C$7$c$k!VA0<T!W$Ne(B)e$B9M$(J}$b$o$+$i$J$$$G$b$J$$$G$9e(B
e$B$,!"$A$g$C$H%k!<%k$,J#;($G0l4S@-$N$J$$$b$N$K$J$k$h$&$J5$$,$7e(B
e$B$^$9!#$I$&$G$7$g$&!)e(B

e$B$^!“%/%i%9JQ?t%”%/%;%9$G!VA0<T!W$H;w$?$h$&$J$3$H$r$7$F$$$k$Ne(B
e$B$G!"@dBP$K$@$a$@$H$O8@$$$^$;$s$,!#e(B

                            e$B$^$D$b$He(B e$B$f$-$R$me(B /:|)