2013-01-18 99 views
0

我是通過Dalli's源代碼閱讀,我發現這個...爲什麼在ruby contsructor/initialize方法中調用超級兩次?

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 

什麼脫穎而出,我是超被初始化時叫了兩聲。我從來沒有見過這種紅寶石成語。你爲什麼要這樣做?

+0

取決於超類初始化器的實現,我猜。或者它可能是一個錯誤。 – Thomas

+0

錯誤,或者他們特別需要在對實例變量進行更改後重新初始化(某些東西)。 –

回答

1

所以我去了回購找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 

看起來像第一個init是要設置這些實例變量。然後使用並添加到他們這是不出所料:最後超級...雖然我會採取瘋狂的猜測,並說它不會做任何有用的,是多餘的。我查看了從AbstractStore繼承的核心類,它們都沒有使用多個對super的調用。也許是一個錯誤[1]。在github上打開一個問題,看看它在哪裏。

[1] This seems somewhat related

編輯:我雖然已經忽略另一件事,是超級的最後一行,因此是返回值。這實際上可能是一個更好的解釋。

相關問題