2009-03-30 5 views
72

내가 인스턴스 변수를 사용하고자하는 경우 일부 모듈이 나는 현재이처럼 초기화 해요 :Ruby에서 모듈의 인스턴스 변수를 초기화하는 방법은 무엇입니까? .

module MyModule 
    def self.method_a(param) 
    @var ||= 0 
    # other logic goes here 
    end 
end 

나는 또한 그것들을 초기화하기 위해 init 메소드를 호출 할 수 있습니다

def init 
    @var = 0 
end 

그러나 이것은 내가 항상 그것을 부르는 것을 기억해야한다는 것을 의미 할 것입니다.

더 좋은 방법이 있나요?

def init(var=0) 
@var = var 
end 

을 그리고 당신은 아무것도 통과하지 않는 경우는 디폴트로 0이됩니다

+3

첫 번째 코드 블록은 모듈 인스턴스 var (MyModule 유형 객체의 범위에있는 var)를 설정하지 않지만 두 번째 코드 블록은 "일반"인스턴스 var (var를 포함하는 인스턴스의 범위에있는 var)를 설정하지 않습니다. 기준 치수)? 나는이 두 코드 블록이 똑같은 일을하지 않는다고 생각한다 ... –

답변

98

모듈의 정의를 초기화합니다.

module MyModule 
    # self here is MyModule 
    @species = "frog" 
    @color = "red polka-dotted" 
    @log = [] 

    def self.log(msg) 
    # self here is still MyModule, so the instance variables are still available 
    @log << msg 
    end 
    def self.show_log 
    puts @log.map { |m| "A #@color #@species says #{m.inspect}" } 
    end 
end 

MyModule.log "I like cheese." 
MyModule.log "There's no mop!" 
MyModule.show_log #=> A red polka-dotted frog says "I like cheese." 
        # A red polka-dotted frog says "There's no mop!" 

이렇게하면 모듈이 정의 될 때 인스턴스 변수가 설정됩니다.

# continued from above... 
module MyModule 
    @verb = "shouts" 
    def self.show_log 
    puts @log.map { |m| "A #@color #@species #@verb #{m.inspect}" } 
    end 
end 
MyModule.log "What's going on?" 
MyModule.show_log #=> A red polka-dotted frog shouts "I like cheese." 
        # A red polka-dotted frog shouts "There's no mop!" 
        # A red polka-dotted frog shouts "What's going on?" 
+17

누군가가 신랄한 가이드를 읽었습니다.) –

+12

예, 그렇습니다. :). 게다가, 나는 Messrs Foo와 Bar에 관해서 말할 필요가있는 모든 것이 있다고 말했습니다. – rampion

+0

답변 해 주셔서 감사합니다. – Geo

6

당신은 사용할 수 있습니다. 초기화가 때마다 호출되기 때문에, 나는 다음과 같은 말 것, 클래스에 대한

module AppConfiguration 
    mattr_accessor :google_api_key 
    self.google_api_key = "123456789" 
... 

end 
+0

그래서 모듈을 사용하기 전에이 함수를 호출해야한다. – Geo

+0

레일 피팅 코드 – Brian

2

: 당신이 매번 호출하고 싶지 않은 경우

는, 다음과 같이 사용할 수 있습니다. 새로운 클래스의 인스턴스. Practical Ruby에서

def initialize 
    @var = 0 
end 

:

이 클래스의 초기화를 포함한 이 슈퍼를 호출하는 경우 모듈의 초기화가 호출 될 말을 계속하지만,이 이 결과임을 언급하지 않습니다 어떻게 슈퍼가 작동하는지 도처에, 을위한 특별한 취급이 초기화되지 않는다. (왜 하나 초기화 특수 처리를 얻을 가정 할 수? 그것을 가시성에 대한 특별한 처리를 얻을 수 있기 때문에. 특별한 경우를 혼란을 만들 수 있습니다.)

+1

에서 문제가 발생하지 않도록 두 번째 방법을 추가했습니다. 해당 모듈이 초기화 되었기 때문에 호출됩니다. 그게 첫 번째 대답이었습니다. 내가 호출하지 않는 것을 설명하기 위해 두 번째를 추가했습니다. – Brian

+1

OP 특별히 언급 된 모듈, 클래스가 아닙니다. – Zensaburou

1

내가,이

을하고 클래스 인스턴스 변수를 설정할 수 있습니다 유사한 question 대답 : 당신은 alwasys 나중에, 더 많은 인스턴스 변수와 메소드 정의를 추가하거나 기존 재정의 모듈을 다시 열 수 있습니다 기억
module MyModule 
    class << self; attr_accessor :var; end 
end 

MyModule.var 
=> nil 

MyModule.var = 'this is saved at @var' 
=> "this is saved at @var" 

MyModule.var  
=> "this is saved at @var" 
2

분명히 루비의 모듈에서 인스턴스 변수를 초기화하는 것은 좋지 않습니다. (이유 나는 완전히 이해하지 않지만, 상황이 인스턴스화되는 순서에 관한.)

가장 좋은 방법은 지금처럼 게으른 초기화에 접근을 사용하는 것 같습니다 :

module MyModule 
    def var 
    @var ||= 0 
    end 
end 

다음 @var의 게터로 var을 사용하십시오.

+3

참고 : 이렇게하면 @var를'nil' 또는'false'로 설정할 수 없습니다 – steel

관련 문제