在 Ruby 中,使用 定义类的内容时class_exec
,我得到了意想不到的结果。当我在发送到的块中定义一个类变量时class_exec
,该类变量被定义在Object
而不是class_exec
被调用的类:
class X; end
X.class_exec do
@@inner_value = "123"
def inner_value
@@inner_value
end
def inner_value=(arg)
@@inner_value = arg
end
end
obj1 = X.new
puts obj1.inner_value
puts @@inner_value
puts Object.class_variables
产生:
123
123
@@inner_value
使用时不会发生这种情况class_eval
:
X.class_eval(<<-RUBY)
@@inner_value = "123"
def inner_value
@@inner_value
end
def inner_value=(arg)
@@inner_value = arg
end
RUBY
obj1 = X.new
puts obj1.inner_value
puts @@inner_value
puts Object.class_variables
产生:
123
和一个错误:
uninitialized class variable @@inner_value in Object (NameError)
class_eval 的结果是我期望在这两种情况下发生的结果。我在 MRI 1.8.7 和 MRI 1.9.3 上都试过了,在 Windows XP 上运行时得到了相同的结果。
这是预期的行为吗?如果是这样,为什么?如果没有,错误?