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

From: Tanaka Akira <akr@...17n.org>
Date: 2004-09-04 15:56:25 UTC
List: ruby-dev #24218
In article <1094229200.559688.22218.nullmailer@picachu.netlab.jp>,
  Yukihiro Matsumoto <matz@ruby-lang.org> writes:

> した。ということで、以下のように修正してみました。

core を吐かなくなったのは喜ばしいのですが、instance_eval 内におけるク
ラス変数のスコープがよく理解できません。

% ruby -e '
class C
  @@a = 1
  p 0.instance_eval("@@a")
end'
-e:4:in `instance_eval': (eval):1:in `instance_eval': no class variables available (TypeError)
        from -e:4:in `instance_eval'
        from -e:4

というように、instance_eval の呼び出し側のスコープは関係なくなるのかな、
と思いきや、

% ruby -e '
class C
  @@a = 1
  p "".instance_eval("@@a")
end'
1

というように、instance_eval の receiver を "" に変えただけで外側のクラ
ス変数が参照できるようになったりします。

なら、Fixnum にはクラス変数は持てないのかと思うと、

% ruby -e '
class Fixnum
  @@a = 1
  p @@a
end'
1

というように、そうではないようです。

0.instance_eval("@@a") が例外になるのはいったいなぜなんでしょうか?
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread