5
0

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 1 year has passed since last update.

Ruby開発Advent Calendar 2022

Day 2

Ruby 3.0 に含まれる非互換「位置引数とキーワード引数の分離」の乗り越え方

Last updated at Posted at 2022-12-01

0. はじめに

おはよう、Ruby エンジニアの皆さん。2022 年も年の瀬となりましたが、元気にしていますか?

実を言うと Ruby 2.7.x はもうだめです。突然こんなこと言ってごめんね。

でも本当です。今年の 4/12 に Ruby 2.7.6 がリリースされました。

それが終わりの合図です。程なく始まるセキュリティメンテナンスフェーズは 1 年しかないので気をつけて。

それがやんだら、少しだけ間をおいて終わりがきます。

参考: 「実を言うと、地球はもうだめです。」

1. 要するに、来年の 4 月で Ruby 2.7.x のサポートが終了します

そんなわけで、見て見ぬ振りをしてきた、あなたのプロジェクトの Ruby バージョンの更新も、ついには年貢の納め時というわけです。まだ時間は残されていますので、年内から調査と検討を開始しましょう :rolling_eyes:

さて、Ruby 2.7.x 以下からバージョンを上げる場合、次のメジャーバージョンは少し飛んで 3.0.x になるのですが、ここには大きな非互換が潜んでいます。そう、Ruby 本体を始め、Rails やほとんどの Gem が修正対応を余儀なくされた、

位置引数とキーワード引数の分離 (Separation of positional and keyword arguments)

への対応が必要になるのです。

2. 「位置引数とキーワード引数の分離」とは

詳細な説明については、以下の公式ガイドに譲るとして、この非互換な変更は、Ruby 2.7.0 の段階で既に含まれておりました。ただ、あまりに影響が大きいことが予想されたため、2.7.0 の時点では、修正が必要なコードがあってもエラーとはならず、deprecation warning が出力されるだけの対応でした。これが、3.0.0 以降の Ruby バージョンになると、しっかりエラーを起こすようになります。

参考: Ruby 3.0における位置引数とキーワード引数の分離について

3. 修正箇所を静的コードチェックで検出できないの?

Ruby 自らが warning を出してくれるということで、チェックツールぐらいどこかに存在してそうに思えますが、私が探してみた限り、そんなものはありませんでした。「Rubocop で対応を検討していたが、誤検出が多かったのでマージが見送られた」というような話しもどこかで聞いた気がするのですが、記憶が定かでないです。この辺のお話しに詳しい方がいらっしゃいましたら、ぜひコメントで教えてください :pray:

ともかく、要修正箇所を洗い出すところから、自分たちの手でなんとかする必要があります :dizzy_face:

4. Ruby 2.7.2 以降は deprecation warning がデフォルト非表示になっている件

実はそうなんです。Ruby 2.7.0 で「位置引数とキーワード引数の分離」に関する deprecation warning を出力する対応が入ったものの、Ruby 2.7.2 からは、上記を含む deprecation warning 出力自体がデフォルト非表示になってしまっています。なので、大抵の環境では、コマンドラインオプションを使うなどして、deprecation warning の出力を ON にするところから始める必要があります。

参考: Ruby 2.7.2 リリース

5. 組み込みライブラリ module Warning を使おう

とは言え、希望はあります。Ruby 2.5.0 以降であれば、Ruby の warning 出力を制御できる、Warning という組み込みライブラリが利用できます。Warning.warn をオーバーライドするだけで、メッセージのフィルタリングや、出力先の変更が可能です。これを利用して、要修正箇所を収集するコードを書いてみました。とりあえず Rails 向けに書いたのですが、Rails 以外でもちょっと改変すれば使えると思います。

参考: module Warning
参考: Ruby 2.5のカスタマイズ可能なWarningモジュール(翻訳)

6. 次の記事に続く...

で、そのコードなのですが、この記事が長くなっちゃったので、次の記事に分けます :sweat_smile: 以下のクソダサいタイトルの記事へどうぞ

「位置引数とキーワード引数の分離」の要修正箇所収集するマン
5
0
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
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?