28
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-04-15

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

28
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?