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を使用した結果は、どちらの場合も発生すると予想される結果です。MRI1.8.7とMRI1.9.3の両方でこれを試しましたが、WindowsXPで同じ結果が得られました。
これは予想される動作ですか?もしそうなら、なぜですか?そうでない場合、バグ?