在活动记录模型中,我们会根据我们的需要设置选项后覆盖serializable_hash
方法并调用super options
。
通常我们这样做:
def serializable_hash options=nil
options ||= {
only: [
:id,
:special_instructions
],
include: { images: nil },
methods: [:catalog_item_name, ]
}
super options
end
但是在其中一个模型中,我们意外地 明确地将options
传递给super方法。尽管如此,它似乎正在起作用,就好像我们正在通过选项一样。
在阅读serializable_hash source code之后,我们似乎无法找到在超级方法中正确初始化选项的任何理由。
有关这种情况的任何提示?
当然,尝试在ruby脚本中重现结构似乎并没有以同样的方式实现。 以下是我们为了尝试而编写的内容:
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!' }
(正如我们所料)
答案 0 :(得分: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
的{{1}}参数隐含在D#m
中,当你没有为父版本{提供任何显式参数时{1}}。
为super
定义添加一个参数,你会看到一些东西。