編集:以下のコードは 1.8.7 と 1.9.1 でテストされています... 1.9.2 では状況が異なるようです:/
状況は実際にはそれほど単純ではありません。class_eval
1.8 と 1.9 のどちらを使用しているか、またはを使用しているかによって、動作に違いがありますinstance_eval
。
以下の例では、ほとんどの状況での動作について詳しく説明しています。
また、定数の動作はクラス変数と似ていますが、まったく同じではないため、適切な測定のために含めました。
クラス変数
class_eval
ルビー1.8で:
class Hello
@@foo = :foo
end
Hello.class_eval { @@foo } #=> uninitialized class variable
class_eval
Ruby 1.9 で:
Hello.class_eval { @@foo } #=> :foo
そのため、クラス変数は1.9 で検索されます (1.8 では検索されません)。class_eval
instance_eval
Ruby 1.8および1.9で
Hello.instance_eval { @@foo } #=> uninitialized class variable
Hello.new.instance_eval { @@foo } #=> uninitialized class variable
使用時にクラス変数が1.8または1.9で検索されないようですinstance_eval
また興味深いのは、定数の場合です。
定数
class_eval
ルビー1.8で
class Hello
Foo = :foo
end
Hello.class_eval { Foo } #=> uninitialized constant
class_eval
ルビー1.9で
Hello.class_eval { Foo } #=> :foo
したがって、クラス変数と同様に、定数は 1.9 では検索されますが、1.8 では検索されません。class_eval
instance_eval
ルビー1.8で
Hello.instance_eval { Foo } #=> uninitialized constant
Hello.new.instance_eval { Foo } #=> uninitialized constant
instance_eval
ルビー1.9で
Hello.instance_eval { Foo } #=> uninitialized constant
Hello.new.instance_eval { Foo } #=> :foo
定数ルックアップは、Ruby 1.9 のクラス変数ルックアップとあまり似ていないようです。Hello
インスタンスは定数にアクセスできますが、クラスHello
はアクセスできません。