在Ruby中,当定义类为class_exec
的内容时,我得到了意想不到的结果。当我发送到class_exec
块定义一个类变量,类变量正在对Object
代替其上class_exec
被称为类定义:Ruby:定义类变量时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上运行的结果相同。
这是预期的行为?如果是这样,为什么?如果没有,错误?