为什么在ruby构造函数/初始化方法中调用super两次?

时间:2013-01-18 19:30:48

标签: ruby dalli

我正在阅读Dalli's源代码,我发现了这个......

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 = !!@default_options[:raise_errors]

        super
      end

      .... rest of class definition

对我来说最突出的是超级在初始化期间被叫了两次。我以前从未见过这种红宝石成语。你为什么要这么做?

1 个答案:

答案 0 :(得分:1)

所以我去了repo追捕AbstractStore,这是rails'actionpack的一部分。没有初始化,所以没有任何行为可以保证这样的使用。 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

编辑:我忽略了另一件事,super在最后一行,因此是返回值。这实际上可能是一个更好的解释。