3
1

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 のメソッド定義で引数が「*」だけの場合

Posted at

OSSライブラリのドキュメントを見ていると以下のようなコードがありました。

def initialize(*)
  super
  # 以下、何らかのコード
end

この * が文法的にどういう意味なのか気になったので調べました。

結論

任意の引数を受け取るが、特にコード内では参照しない(無視する)という意味になるようです。

class Foo
  def bar(*)
    "bar"
  end

  def baz
    "baz"
  end
end

Foo.new.bar("foo", 1, [2]) # => エラーにならない
Foo.new.baz("foo", 1, [2]) # => ArgumentError が発生

メソッド内で super を呼び出すと、親クラスのメソッドに指定された引数をそのまま渡します。
指定された引数の個数が、親クラスのメソッド定義の引数の個数と異なる場合、 ArgumentError が発生します。

class Parent
  def hello(name)
    "Hello #{name}!"
  end
end

class Child < Parent
  def hello(*)
    super
  end
end

Child.new.hello("World") # => "Hello World!"
Child.new.hello # => ArgumentError
Child.new.hello(1, 2) # => ArgumentError

参考

リファレンスマニュアルには以下のように記載されています。
https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#method

def bar(x, *) # 残りの引数を単に無視したいとき
  puts "#{x}"
end
bar(1)        #=> 1
bar(1, 2)     #=> 1
bar(1, 2, 3)  #=> 1
3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?