[ruby-dev:24229] scope rule of class_eval "..."

From: Tanaka Akira <akr@...17n.org>
Date: 2004-09-06 09:01:28 UTC
List: ruby-dev #24229
疑問に思ったのですが、次のように class_eval に文字列を与えた場合に、レ
シーバ A の中で定義された定数が参照できるのは意図されているのでしょう
か?

% ruby -ve '
class A
  Const = 1
end
A.class_eval "p Const"
'
ruby 1.9.0 (2004-09-06) [i686-linux]
1

次のように試してみると、class_eval に文字列を与えた時だけ、定数とクラ
ス変数がレシーバの環境で評価される感じです。

% ruby <<'EE'
class A
  Const = :A
  @ivar = :Ac
  @@cvar = :A
  def initialize
    @ivar = :Ai
  end
end
class B
  Const = :B
  @ivar = :Bc
  @@cvar = :B
  def initialize
    @ivar = :Bi
  end
  def test_i_i_b() A.new.instance_eval { p [Const, @ivar, @@cvar] } end
  def test_i_i_s() A.new.instance_eval " p [Const, @ivar, @@cvar] " end
  def test_c_i_b() A.instance_eval { p [Const, @ivar, @@cvar] } end
  def test_c_i_s() A.instance_eval " p [Const, @ivar, @@cvar] " end
  def test_c_c_b() A.class_eval { p [Const, @ivar, @@cvar] } end
  def test_c_c_s() A.class_eval " p [Const, @ivar, @@cvar] " end
end
B.new.test_i_i_b
B.new.test_i_i_s
B.new.test_c_i_b
B.new.test_c_i_s
B.new.test_c_c_b
B.new.test_c_c_s
EE
[:B, :Ai, :B]
[:B, :Ai, :B]
[:B, :Ac, :B]
[:B, :Ac, :B]
[:B, :Ac, :B]
[:A, :Ac, :A]
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread

Prev Next