2016-03-30 38 views
0

アクティブレコードモデルでは、serializable_hashメソッドをオーバーライドし、必要に応じてオプションを設定した後にsuper optionsを呼び出します。serializable_hash superは、オーバーライドされたメソッドで定義されたオプションをどのように取得しますか?

一般的に我々はやる:

def serializable_hash options=nil 
    options ||= { 
     only: [ 
     :id, 
     :special_instructions 
     ], 
     include: { images: nil }, 
     methods: [:catalog_item_name, ] 
    } 
    super options 
    end 

しかし、モデルの一つで、偶然、私たちはスーパーメソッドに明示的optionsを渡すないました。それにもかかわらず、オプションを渡しているかのように動作しているようです。

serializable_hash source codeを読んだ後、スーパーメソッドでオプションを正しく初期化する理由が見つからないようです。

これはどのように起こっているのですか?

もちろん、ルビスクリプトで構造を再現しようとしても、同じように起こるようには見えません。ここ は、我々はそれを試してみるために書かれたものです:

module MyModule 
    def my_module_method options=nil 
    options ||= { test: 'Test' } 
    end 
end 

class MyTest 
    include MyModule 

    def my_module_method 
    options = { bingo: 'Bingo!' } 
    super 
    end 
end 

puts MyTest.new.my_module_method 

これは{ test: 'Test' }を印刷し、我々はオプション(super options)を渡した場合(私たちが期待するよう)、(から

答えて

2

{ bingo: 'Bingo!' }を印刷しますpickaxe book (AKA Programming Ruby))かなり古い:

あなたは引数なしでsuperを起動すると、Rubyは、現在のメソッドと同じ名前のメソッドを呼び出すためにそれを求めて、現在のオブジェクトの親にメッセージを送信します現在のメソッドに渡されたパラメータを渡します。

ので、この与えられた:あなたはmの親バージョンのための明示的な引数を指定しないときD#mからx引数はsuperで暗黙的であるため、

class C 
    def m(x) 
    puts x 
    end 
end 
class D < C 
    def m(x) 
    super 
    end 
end 
D.new.m(6) 

あなたは6が表示されます。

MyTest#my_module_methodの定義に引数を追加すると、何かが表示されます。

関連する問題