我正在阅读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
对我来说最突出的是超级在初始化期间被叫了两次。我以前从未见过这种红宝石成语。你为什么要这么做?
答案 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在最后一行,因此是返回值。这实际上可能是一个更好的解释。