ruby3.0で「hashをキーワード引数に自動変換する機能」の削除がリスケされた流れを自分なりに理解する記事

なにこれ

ruby3.0で「hashをキーワード引数に自動変換する機能」を削除する予定だったけど、延期もしくは中止する

と、Matzがrailsのフォーラムでコメントしていたので、その経緯とかを把握するために記事にしました

discuss.rubyonrails.org

そもそも、hashをキーワード引数に自動変換する機能って?

def a(hoge:)
  p hoge
end

a(hoge: 'a')
a({hoge: 'b'})

こんな感じに、メソッドがキーワード引数の場合、hashを引数に渡しても良い感じに解釈してくれる機能

なんで自動変換機能が削除されるの?

この機能のために、バグが発生したり、機能の追加が面倒という欠点があったので、2017年頃には、ruby 3.0.0 からは削除されるという話が出ていた

また、その前準備の期間として、ruby 2.7では、非推奨の機能とされ、Warningが出るように変更された

上のコードをruby2.7.1で実行すると警告が出る

01.rb:6: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
01.rb:1: warning: The called method `a' is defined here

techracho.bpsinc.jp

なんで自動変換機能が削除が延期されたの?

Railsフォーラムで、上記の警告が大量に出過ぎて鬱陶しい & 対応がすごい大変という話が上がった(らしい)

それに対して、Matzが以下のようにフォーラムにコメントした

  • 多すぎるWarningがノイズになっているのを認識している。2.7.2ではWarningを消すか減らす
  • 移行コストを低く見積もりすぎていた
  • 上記のために、ruby3.0でキーワード引数をどうするか(延期/中止)検討する

👇リスケに関しての記事

techracho.bpsinc.jp

今後どうするの?

Ruby側は、以下のissueで議論するらしい

bugs.ruby-lang.org

感想

  • Rails使っていて、rubyのアップデート考えている人は、Ruby側の結論と、それに対してのRails側の反応を見てから、どうするか決めたほうが良いんじゃないですかね
  • ruby2.7系については、APIレベルでの非互換性がある変更は無いはずなので、特に慌てることは無いのでは