РЕДАКТИРОВАТЬ: ниже код был протестирован с 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
в рубине 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
Интересен также случай констант :
Константы * +1051 *
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
- нет.