0

ダリのソースコードを読んでいて、これを見つけました...

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 が 2 回呼び出されたことです。私は、この種の Ruby の慣用句を見たことがありません。なぜあなたはこれをしたいのですか?

4

1 に答える 1

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

最初の初期化は、これらのインスタンス変数を設定することのようです。次に、当然のことですが、それらを使用して追加します。最後のスーパーですが...私は大げさな推測をして、それは何も役に立たず、不必要だと言います。AbstractStore から継承するコア クラスを調べましたが、それらのいずれも への複数の呼び出しを使用していませんsuper。多分バグ[1]。github で問題を開いて、それがどこにつながるかを確認してください。

[1]これは多少関係があるようです

編集:私は別のことを見落としていましたが、スーパーは最後の行にあり、したがって戻り値です。これは実際にはより良い説明かもしれません。

于 2013-01-18T20:20:02.597 に答える