2016-01-17 5 views
0
class MySelf 
    @@name = 'jonathan' 
    def self.name 
    @@name 
    end 
end 

MySelf.instance_eval {@@name} 
MySelf.class_eval {@@name} 

как бросок:Почему `instance_eval` /` class_eval` не может получить доступ к переменным класса?

NameError: uninitialized class variable @@collection in Object 

но

MySelf.instance_eval {name} 
MySelf.class_eval {name} 

оба работают.

Как я могу получить доступ к статическому var @@name с помощью instance_eval/class_eval или как назначить значение извне класса?

+0

не может быть воспроизведен. – sawa

ответ

0

Ошибка, вызванная тем, что ошибка MySelf.instance_eval('@@name') вызывает ошибку. Это не переменная экземпляра, это переменная класса. Вы захотите иметь MySelf.class_eval('@@name') на своем собственном, и тогда это сработает.

Проверить РЕПЛО здесь: https://repl.it/Be0U/0

Чтобы установить переменный класс, используйте class_variable_set так:

MySelf.class_variable_set('@@name', 'graham') 
+0

спасибо, но я не понимаю, почему это не работает: 'MySelf.class_eval {@@ name}', но это работает 'MySelf.class_eval ('@@ name')' – jacr1614

+0

В фигурных скобках указывается блок, скобки проходят параметры для метода. – Rots

-1

Я думаю, что вы должны использовать переменную экземпляра класса .

class MySelf 
    @name = 'jonathan' 

    def self.name 
    @name 
    end 
end 

MySelf.instance_eval { @name } # => "jonathan" 
MySelf.class_eval { @name } # => "jonathan" 

Попробуйте, плз.