编辑:下面的代码用 1.8.7 和 1.9.1 进行了测试......似乎情况再次与 1.9.2 不同:/
情况实际上并没有那么简单。根据您使用的是 1.8 还是 1.9 以及您使用的是class_eval
还是instance_eval
.
下面的示例详细说明了大多数情况下的行为。
为了更好地衡量,我还包括了常量的行为,因为它们的行为类似于类变量,但不完全相同。
类变量
class_eval
在 Ruby 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
在 Ruby 1.8 中
class Hello
Foo = :foo
end
Hello.class_eval { Foo } #=> uninitialized constant
class_eval
在 Ruby 1.9 中
Hello.class_eval { Foo } #=> :foo
因此,与类变量一样,常量在 1.9 中查找,但在 1.8 中不查找class_eval
instance_eval
在 Ruby 1.8 中
Hello.instance_eval { Foo } #=> uninitialized constant
Hello.new.instance_eval { Foo } #=> uninitialized constant
instance_eval
在 Ruby 1.9 中
Hello.instance_eval { Foo } #=> uninitialized constant
Hello.new.instance_eval { Foo } #=> :foo
看起来常量查找与 Ruby 1.9 的类变量查找不太相似。Hello
实例确实可以访问常量,而Hello
类则不能。