29
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

Rubyメソッドの引数の数を知る

Rubyメソッドの引数の数を知る

Method#parameters

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 を使う

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
29
Help us understand the problem. What are the problem?