LoginSignup
3
2

More than 1 year has passed since last update.

引数を影響を与えずにメソッドをオーバーライドしたい時は ... 記法を使う

Last updated at Posted at 2021-08-03

概要

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

3
2
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
2