7

假设您要覆盖具有不同数量的子类中的方法:

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在这里获得在线的arity?

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

谢谢你的帮助!

4

1 回答 1

7

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

super(arg1)

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

更新

由于一些downvotes,我想我应该回答你最初的问题。

如何获得“超”的丰富度?

从 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
于 2012-10-22T12:32:17.730 回答