2014-01-29 4 views
1

아래 코드에서 외부에서 reserved_words에 어떻게 액세스합니까? FriendlyId::Reserved::Configuration.instance_variable_get(:reserved_words) 이렇게하는 것은 나에게 다음과 같은 오류를 제공외부에서 모듈의 attr_accessor 변수를 호출하는 방법?

module FriendlyId 
    module Reserved 
     module Configuration 
     attr_accessor :reserved_words 
     end 
    end 
end 

:

NameError: 'reserved_words' is not allowed as an instance variable name

+0

특별히 'attr_accessor'가 필요합니까, 아니면 레일즈가'mattr_accessor'를 제공하는 확장 기능을 사용할 수 있습니까 (http://api.rubyonrails.org/classes/Module.html#method-i-mattr_accessor) – Shadwell

+0

시험해보세요 :: FriendlyId :: Reserved :: Configuration.instance_variable_get (: reserved_words) – Egalitarian

+0

이 스레드를 확인하십시오 http://stackoverflow.com/questions/185573/what-is-mattr-accessor-in-a-rails-module – xlembouras

답변

1

올바른 ::attr_accessor의 사용, 인스턴스와 클래스 변수는 다음이다. ::attr_accessor 그냥 인스턴스 메소드 #mm=의 쌍을 정의하고 있기 때문에, 모듈에 할당 모듈을 사용할 수 없습니다 :

module M 
    attr_accessor :m 
end 

M.instance_methods 
# => [:m, :m=] 
M.instance_variables 
# => [] 

있지만 클래스에 사용될 수 있습니다 :

class A 
    include M 

    def initialize 
     @m = 1 
     @@mm = 2 
    end 

    def self.mm 
     @@mm 
    end 
end 

a = A.new 
p a.m 
# => 1 
p A.mm 
# => 2 
p A.new.instance_variable_get(:@m) 
# => 1 
p A.class_variable_get(:@@mm) 
# => 2 

위의 예에서는 클래스 변수 @@mm을 정의했으며이 경우에만 ::class_variable_get 메소드로 읽을 수 있습니다. 인스턴스 변수 @m은 클래스 인스턴스가 생성되었을 때만 읽을 수 있습니다.

관련 문제