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ますか?

(実際の使用例:superスーパークラスが引数を取らないことを知って呼び出しています。ただし、(gem 内の) スーパークラスの実装が変更された場合は、警告を発行したいと思います。)

ご協力いただきありがとうございます!

4

1 に答える 1

7

あなたの実際のユースケースに関して:引数を自分でチェックする必要はありません。電話するだけ

super(arg1)

ArgumentError引数の数が一致しない場合、Ruby はエラーを発生させます。

アップデート

いくつかの反対票があるため、最初の質問に答える必要があると思います。

「超」のアリティを取得するには?

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
于 2012-10-22T12:32:17.730 に答える