Scala 3 遷移指南

元程式設計

語言

在稱為巨集展開的編譯器階段執行對巨集方法的呼叫,以產生程式的一部分,即抽象語法樹。

Scala 2.13 巨集 API 與 Scala 2.13 編譯器內部緊密結合。因此,Scala 3 編譯器無法展開任何 Scala 2.13 巨集。

相反地,Scala 3 導入了一種新的、經過設計以確保穩定的元程式設計原則。Scala 3 巨集和一般內嵌方法將與 Scala 3 編譯器的未來版本相容。雖然這是一個無可爭議的進步,但也表示所有 Scala 2.13 巨集都必須使用新的元程式設計功能從頭改寫。

巨集依賴關係

即使 Scala 3 模組包含巨集定義,它也可以依賴於 Scala 2.13 人工製品,但編譯器將無法展開其巨集。當您嘗試時,它只會傳回錯誤。

 -- Error: /src/main/scala/example/Example.scala:10:45 
 10 |  val documentFormat = Json.format[Document]
    |                            ^
    |Scala 2 macro cannot be used in Scala 3. See https://dotty.epfl.ch/docs/reference/dropped-features/macros.html
    |To turn this error into a warning, pass -Xignore-scala2-macros to the compiler

請注意,使用 -Xignore-scala2-macros 有助於類型檢查程式碼,但它會產生不完整的類別檔案。

當此錯誤出現在您的專案中時,您最終別無選擇,只能升級到巨集人工製品的 Scala 3 編譯版本。

移植巨集生態系統

雖然是實驗性的,但 Scala 社群已在多種方式中廣泛採用 Scala 2 巨集功能:程式碼產生、最佳化、符合人體工學的 DSL…

生態系統的很大一部分現在依賴於外部函式庫中定義的 Scala 2.13 巨集。找出並移植這些函式庫是推動生態系統向前發展的關鍵。

許多開源巨集函式庫的遷移狀態可在 此頁面 中找到。

重寫巨集

新的元程式設計功能與 Scala 2 完全不同。它們包含

在深入重新實作巨集之前,您應該問自己

  • 我可以使用 inlinescala.compiletime 運算來重新實作我的邏輯嗎?
  • 我可以使用更簡單、更安全的基於表達式的巨集嗎?
  • 我是否真的需要存取 AST?
  • 我可以使用 比對類型 作為回傳類型嗎?

您可以透過閱讀 Scala 3 中的巨集 教學課程來學習所有新的元程式設計概念。

跨建構巨集函式庫

您已撰寫一個很棒的巨集函式庫,您希望它可以在 Scala 2.13 和 Scala 3 中使用。有兩種不同的方法,傳統的跨建構技術和更靈活的巨集混合技術。

巨集混合的優點是,利用 -Ytasty-reader 選項的使用者仍然可以使用您的巨集。

您可以透過閱讀這些教學課程來了解它們

其他資源

部落格文章和演講

早期採用專案

此頁面的貢獻者