如何获得“超级”的智慧?

时间:2012-10-22 11:47:16

标签: ruby

假设您正在覆盖具有不同arity的子类中的方法:

class A
  def foo(arg)          # arity is 1
    # doing something here
  end
end

class B < A
  def foo(arg1, arg2)   # arity is 2
    super(arg1)         # <- HERE
  end
end

有没有办法在这里上线super

(真实用例:我正在调用super知道超类不接受任何参数。但是,如果超类实现(在gem中)发生变化,我想发出一个警告。)

感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

关于您的真实用例:您无需自己检查参数。只需致电

super(arg1)

如果参数计数不匹配,Ruby将引发ArgumentError

更新

由于一些贬值,我想我应该回答你的初步问题。

  

如何获得“超级”的智慧?

从Ruby 2.2开始,有Method#super_methodUnboundMethod#super_method

class A
  def foo(arg)
  end
end

class B < A
  def foo(arg1, arg2)
  end
end

B.instance_method(:foo).arity #=> 2
B.instance_method(:foo).super_method.arity #=> 1

B#foo内,你可以写:

class B < A
  def foo(arg1, arg2)
    method(__method__).super_method.arity #=> 1
  end
end