0

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

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

令我印象深刻的是 super 在初始化期间被调用了两次。我以前从未见过这种红宝石成语。你为什么要这样做?

4

1 回答 1

1

所以我去 repo 寻找AbstractStore这是 rails 动作包的一部分。没有初始化,所以没有行为可以保证这样的使用。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]这似乎有些相关

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

于 2013-01-18T20:20:02.597 回答