我想我知道super
打算覆盖从父类继承的相同方法。但是,在下面的消息传递代码示例中,我不知道super
应该做什么:
class WellBehavedFooCatcher
def respond_to?(method_name)
if method_name.to_s[0,3] == "foo"
true
else
super(method_name)
end
end
end
那么super
在上面的代码中做了什么?
提前非常感谢你!
答案 0 :(得分:2)
super
如何使用参数:
super
- 转发所有参数。super()
- 不转发任何参数。super(arg1,arg2)
- 仅转发arg1
和arg2
。使用参数调用(在本例中为method_name
),super
仅将此参数发送到它通过方法查找路径找到的下一个respond_to?
方法。在这种情况下,由于super
具有唯一的参数,super
和super(method_name)
的行为方式相同。
下一个respond_to?
方法很可能是原始respond_to?
方法,该方法位于Kernel
类中包含的Object
模块中。
Kernel.methods.include?(:include?) #=> true
答案 1 :(得分:2)
我想我知道super打算覆盖从父类继承的相同方法。
实际上,情况正好相反。当您覆盖子类中的某个方法时,super
用于引用父类中相同方法的行为(即原始行为)。
在给定的代码中,缩进是使动态响应任何以foo
开头的方法,而不改变其他方法的可响应性。第一部分由:
if method_name.to_s[0,3] == "foo"
true
但如果只是那样,所有其他未定义的方法只会返回nil
,即使它们是在某个父类中定义的。如果某个父类要响应此类方法,则返回nil
以响应可能会错误地阻止此类方法。另一部分:
else
super(method_name)
是为这种情况返回正确的值。这意味着在其他情况下,做父类做的事情。