2013-01-18 3 views
0

나에게 서 무엇 루비 contsructor/초기화 메서드에서 super를 두 번 호출하는 이유는 무엇입니까?

module ActionDispatch 
    module Session 
    class DalliStore < AbstractStore 
     def initialize(app, options = {}) 
     # Support old :expires option 
     options[:expire_after] ||= options[:expires] 

     super 

     @default_options = { :namespace => 'rack:session' }.merge(@default_options) 

     @pool = options[:cache] || begin 
      Dalli::Client.new(
       @default_options[:memcache_server], @default_options) 
     end 
     @namespace = @default_options[:namespace] 

     @raise_errors = [email protected]_options[:raise_errors] 

     super 
     end 

     .... rest of class definition 

슈퍼가 초기화하는 동안 두 번 호출 한 것입니다 ... 나는 Dalli's 소스 코드를 읽고 있던 나는이 발견했다. 전에 이런 종류의 루비 관용어를 보지 못했습니다. 왜 이것을하고 싶습니까?

+0

수퍼 클래스 이니셜 라이저의 구현에 따라 다릅니다. 아니면 버그 일 수도 있습니다. – Thomas

+0

버그, 또는 특별히 인스턴스 변수를 변경 한 후에 다시 초기화해야합니다 (무언가). –

답변

1

그래서 나는 레일 'actionpack의 일부인 AbstractStore을 사냥하기 위해 레포에갔습니다. 초기화하지 않으므로 그러한 사용을 보증하지 않습니다. AbstractStore 또한 Rack::Session::Abstract::ID에서 상속됩니다. 이제 우리는 그 고기를 가지고 있습니다 :

def initialize(app, options={}) 
    @app = app 
    @default_options = self.class::DEFAULT_OPTIONS.merge(options) 
    @key = @default_options.delete(:key) 
    @cookie_only = @default_options.delete(:cookie_only) 
    initialize_sid 
end 

첫 번째 초기화가 그 인스턴스 변수를 설정하는 것처럼 보입니다. 그런 다음 놀랍지 않은 것을 사용하고 추가하십시오 : 마지막 슈퍼입니다 ... 나는 야생 추측을 취하여 유용하지 않으며 불필요하다고 말할 것입니다. AbstractStore에서 상속받은 핵심 클래스를 살펴본 결과 super을 여러 번 호출 한 클래스는 없었습니다. 어쩌면 버그 [1]. github에서 문제점을 열어 그것이 어디에 있는지 확인하십시오.

[1] This seems somewhat related

편집 : 나는 비록 다른 일을 간과, 슈퍼 마지막 줄에 따라서 리턴 값이다. 이것은 실제로 더 나은 설명 일 수 있습니다.