超级方法在ruby代码中做了什么?

时间:2016-03-13 05:07:46

标签: ruby super

我想我知道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在上面的代码中做了什么?

提前非常感谢你!

2 个答案:

答案 0 :(得分:2)

super如何使用参数:

  • super - 转发所有参数。
  • super() - 不转发任何参数。
  • super(arg1,arg2) - 仅转发arg1arg2

使用参数调用(在本例中为method_name),super仅将此参数发送到它通过方法查找路径找到的下一个respond_to?方法。在这种情况下,由于super具有唯一的参数,supersuper(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)

是为这种情况返回正确的值。这意味着在其他情况下,做父类做的事情。