在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上運行的結果相同。
這是預期的行爲?如果是這樣,爲什麼?如果沒有,錯誤?