假设您正在覆盖具有不同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中)发生变化,我想发出一个警告。)
感谢您的帮助!
答案 0 :(得分:6)
关于您的真实用例:您无需自己检查参数。只需致电
super(arg1)
如果参数计数不匹配,Ruby将引发ArgumentError
。
由于一些贬值,我想我应该回答你的初步问题。
如何获得“超级”的智慧?
从Ruby 2.2开始,有Method#super_method
和UnboundMethod#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