2016-03-30 2 views
0

В активной модели записи мы переопределяем метод serializable_hash и вызываем super options после установки параметров, соответствующих нашим потребностям.Как serializable_hash супер получает параметры, определенные в моем переопределенном методе?

Обычно мы делаем:

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), напечатает { bingo: 'Bingo!' } (как и следовало ожидать)

ответ

2

С (а старый) pickaxe book (AKA Programming Ruby):

При вызове super без аргументов, Ruby посылает сообщение родителя текущего объекта, прося его вызвать метод с тем же именем, что и текущий метод, и передавая ему параметры, которые были переданы текущему методу.

Поэтому, учитывая это:

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

вы увидите 6 потому что x аргумент D#m подразумевается в super, когда вы не поставить какие-либо явные аргументы для родительской версии m.

Добавьте аргумент в определение MyTest#my_module_method, и вы увидите что-то.

Смежные вопросы