1/10: Scala 3への移行に関するヒントとコツ。🧵。重要:移行ガイドをよく読み、構文の更新にはscalafixを活用しましょう。手作業にかかる時間を節約できます!
2/10: すべてを新しい構文に置き換えるのは早計です!まずは、コードベースを古い構文でコンパイルし、Scala 3 コンパイラを使ってください。新しい構文には独自のルールがあり、特に古い構文と混在させると、慣れていないと混乱を招くエラーが発生する可能性があります。
3/10 暗黙のパラメータを `using` で置き換える場合、呼び出しサイトで渡す明示的なパラメータにも `using` キーワードが必要であることを忘れないでください。 getUserInfo(userId)(using Tracing.noop) // 正しい
4/10: `using` キーワードを忘れると不可解なエラーが発生します。コンパイラがコードの全く別の部分をハイライトしてしまう可能性があり、デバッグが困難になります。何が起こっているのか理解するのにかなりの時間を費やしました。
5/10: circe に関する警告: `deriveConfiguredCodec` のような半自動導出から `Codec.derived` に移行する場合は注意してください。`Decoder.derived` は `Configuration` を暗黙のパラメータとして受け入れません。代わりに `Decoder.derivedConfigured` を使用してください。
6/10: 新しい derives 構文を使えば、circe の問題を完全に回避できます。case class MyClass(...) derives ConfiguredCodec Decoder.derived でも同じ動作をするだろうと思い込んでいたので、バグを本番環境にプッシュするところでした。別の問題のおかげで、かなり早い段階で発見することができました。
7/10: Doobieユーザーの皆様、Get/Putインスタンスが見つからないという巨大なエラーメッセージにご注意ください。私のケースでは、AnyValクラスが原因でした。コンパイラが以前のようにインスタンスを導出できなかったのです。
8/10: ドゥービー問題の解決策: AnyVal クラスを不透明型に変換し、コンパニオン オブジェクトで特定のインスタンスを提供します。
9/10: レガシーコードで、形状のないタプル構文(Scala 3で削除)を使用するという課題に直面しました。タプル要素を追加してケースクラスに変換する方法が必要でした。最初はScala 3のネイティブタプル構文を試しましたが、CaseClass.tupledと互換性がありませんでした。
10/10: タプルのカスタム拡張機能(実行時エラーのリスクあり)を試した後、追加の値を持つタプルを繋ぎ合わせるにはchimneyライブラリが最適なソリューションだとわかりました。おまけに、chimneyの最新リリースにバグも見つかりました!
何か移行のヒントを見つけましたか?ぜひ以下でシェアしてください! #Scala #Scala3
ボーナス #1: someContextualResource.flatMap { implicit tracing => ... } を someContextualResource.flatMap { case given TracingCtx => ... } に置き換えることができます。完璧ではありませんが、機能します。同じファイルとコードベースで given と implicit を混在させるよりも優れています。