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