2013-12-09 3 views
0

Недавно я столкнулся с концептуальной проблемой ruby ​​с доступом к переменным экземпляра класса через класс вместо соответствующего метода класса. например ...Как получить доступ к переменным экземпляра класса Методы класса VS

class Test 
    @foo = nil 
    def self.foo foo 
    @foo = foo 
    end 
end 

Как я могу получить доступ к @foo из Test без переименования self.foo? Очевидно, что существуют простые способы, но это скорее функциональный вопрос Ruby, чем реальная проблема.

ответ

3

Использование Module#class_eval или Object#instance_variable_get.

class Test 
    @foo = nil 
    def self.foo foo 
    @foo = foo 
    end 
end 

Test.foo(12) 
Test.class_eval('@foo') # => 12 
Test.instance_variable_get('@foo') # => 12 
+1

или 'instance_eval ('@ Foo')' тоже ... так много вариантов! Благодаря! – brewster

+0

@brewster Да .. Вы правы! :) –

+0

@brewster, если вы еще не знаете, подумайте о том, почему 'class_eval' и' instance_eval' работают в этой ситуации. –

0

Я бы назвал сеттер более явно и обеспечить явный класс добытчик ...

@foo = nil 

def self.foo=(foo) 
    @foo = foo 
end 

def self.foo 
    @foo 
end 
+0

Да, я знаю, что есть более простые способы обойти это ... оно возникло из-за того, что требования к DSL требуют установки без '='. Но он просто поднял внутренний рубиновый вопрос, о котором мне было интересно. – brewster

Смежные вопросы