Rubyメソッドの引数の数を知る
Method オブジェクトの引数の情報を返します。
Method オブジェクトが引数を取らなければ空の配列を返します。引数を取る場合は、配列の配列を返し、 各配列の要素は引数の種類に応じた以下のような Symbol と、仮引数の名前を表す Symbol の 2 要素です。 組み込みのメソッドでは、仮引数の名前が取れません。
:req
必須の引数
:opt
デフォルト値が指定されたオプショナルな引数
:rest
- で指定された残りすべての引数
:block
& で指定されたブロック引数
サンプル
class Foo
def self.foo(a)
end
def bar(a, b=1, &block)
end
end
Foo.method(:foo).parameters
#=> [[:req, :a]]
Foo.new.method(:bar).parameters
#=> => [[:req, :a], [:opt, :b], [:block, :block]]
取れた ^^
必須引数だけカウントしたい場合)
m = Foo.new.method(:bar)
m.parameters.select {|param| param.first == :req }.size
オプション引数も合わせてカウントしたい場合)
m = Foo.new.method(:bar)
m.parameters.select {|param| param.first == :req || param.first == :opt }.size
#initialize メソッドの引数の数を知る
疑問に思ったのは #initialize の引数の数をどうとるのか。
class Foo
def initialize(a, b=1)
end
end
Foo.new("a").method(:initialize).parameters
# => 取れるけど、new しちゃってるし、これはちょっと。。。
この場合は、Class#allocate を使えばよさそう。オブジェクト作成だけやって、#initialize は呼ばない。
Foo.allocate.method(:initialize).parameters
# => [[:req, :a], [:opt, :b]]
取れた :D
追記:@a_matsuda さんに、Module#instance_method が使えると教えてもらった。
Foo.instance_method(:initialize).parameters
=> [[:req, :a], [:opt, :b]]
取れた :D
補足
もしくは Method#arity を使う