如何获得"超级"的智慧?

svo*_*oop 7 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
Run Code Online (Sandbox Code Playgroud)

有没有办法super在这里获得在线的arity ?

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

谢谢你的帮助!

Ste*_*fan 6

关于你的真实用例:没有必要自己检查论点.打电话吧

super(arg1)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

从内部B#foo,你可以写:

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

  • @BorisStitnicky如果所需的功能已经内置,你不必重新发明轮子,对吗? (2认同)
  • 好吧,编写一个使用反复试验确定super()的arity的方法当然是可以想象的.但svoops问题比这更深刻.它触及了super()是什么'间接'方法调用的问题.它提出了更多的问题,而不仅仅是arity.例如,我如何定位super()?我怎么知道它采用的是哪个祖先模块?如何从中获取未绑定的方法?一个hacky的答案涵盖了这些问题.我期待有人使用#arity方法给出真正的答案. (2认同)