概要
ruby 3.0 以降はキーワード引数の仕様変更により引数の渡し方によってはエラーになるため、メソッドをオーバーライドするときは引数を ...
にするのがいいという話です。
これは 2.7 から追加された記法で引数の転送(Arguments Forwarding)というらしいです。
class Parent
def self.hoge(a, b, c: 'c')
"#{a}, #{b}, #{c}"
end
end
class Child1 < Parent
def self.hoge(*)
"child1 #{super}"
end
end
class Child2 < Parent
def self.hoge(...)
"child2 #{super}"
end
end
Child1.hoge('d', 'e', c: 'f')
#=> ArgumentError: wrong number of arguments (given 3, expected 2)
Child2.hoge('d', 'e', c: 'f')
#=> "child2 d, e, f"
なんとなくメソッドをオーバーライドしたいけど引数には触れたくない時のイディオムのように def hoge(*)
を使ってましたが、よく考えれば def (*array)
のように 配列として受け取る記法
+ 最後の引数を暗黙的にハッシュとして受け取る
の合わせ技だったということですね。
3.0 でもキーワード引数を使っていなければ引き続き (*)
を使えますが、啓蒙のためにも (...)
をしっかり使っていきたいと思います。
参考
https://docs.ruby-lang.org/ja/latest/doc/news=2f2_7_0.html
https://koic.hatenablog.com/entry/arguments-forwarding-of-ruby-2-7
https://techlife.cookpad.com/entry/2019/12/25/121834