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 我差點就把一個 bug 推送到 prod 了,因為我相信 Decoder.derived 的行為也一樣。幸虧另一個 bug,我才得以及早發現。
7/10:Doobie 使用者:小心那些關於缺少 Get/Put 實例的巨型錯誤訊息。在我的例子中,AnyVal 類別是罪魁禍首——編譯器無法像以前那樣派生實例。
8/10:doobie 問題的解決方案:將 AnyVal 類別轉換為不透明類型並在伴隨物件中提供給定的實例。
9/10:在使用無形元組語法(Scala 3 中已移除)的遺留程式碼中遇到了挑戰。需要一種方法來附加元組元素並轉換為 Case 類別。最初嘗試了 Scala 3 的原生元組語法,但它與 CaseClass.tupled 不相容。
10/10:在嘗試了自訂元組擴展(存在運行時失敗風險)之後,我發現 Chimney 庫是拼接元組並添加附加價值的最佳解決方案。額外福利:我甚至在 Chimney 的最新版本中發現了一個 bug!
你發現了哪些遷移技巧?在下面分享! #Scala #Scala3
Bonus #1: You can replace someContextualResource.flatMap { implicit tracing => ... } with someContextualResource.flatMap { case given TracingCtx => ... } not perfect but works, better than mixing up givens with implicits in the same file and codebase.