Scala 3 中的巨集

Scala 編譯時間操作

語言
此文件頁面專屬於 Scala 3,可能涵蓋 Scala 2 中沒有的新概念。除非另有說明,否則此頁面中的所有程式碼範例都假設您使用的是 Scala 3。

scala.compiletime 中的操作是可以在 inline 方法中使用的巨集編程操作。這些操作涵蓋了一些巨集的常見使用案例,而您不需要定義巨集。

報告

在內聯程式碼時,可以發出錯誤訊息。

inline def doSomething(inline mode: Boolean): Unit =
  if mode then ...
  else if !mode then ...
  else error("Mode must be a known value")

doSomething(true)
doSomething(false)
val bool: Boolean = ...
doSomething(bool) // error: Mode must be a known value

如果在內聯方法之外呼叫 error,則編譯該呼叫時將發出錯誤。如果在內聯方法內撰寫 error,則只有在內聯呼叫後未將其移除為死路徑的一部分時,才會發出錯誤。在前面的範例中,如果在編譯時已知 mode 的值,則我們只會保留前兩個分支中的其中一個。

如果我們想要在錯誤訊息中包含引數的原始碼一部分,則可以使用 codeOf 方法。

inline def doSomething(inline mode: Boolean): Unit =
  if mode then ...
  else if !mode then ...
  else error("Mode must be a known value but got: " + codeOf(mode))

val bool: Boolean = ...
doSomething(bool) // error: Mode must be a known value but got: bool

召喚

有兩種方法可以在內聯方法中召喚值,第一種是使用 using 參數,第二種是使用 summonInlinesummonAllsummonFrom 之一。 using 會在呼叫點內聯之前召喚值,就像該方法不是 inline 一樣。另一方面,如果呼叫未從死路徑中消除,summonInline 會在內聯後召喚。 summonAll 提供了一種從元組類型同時召喚多個值的方法。 summonFrom 提供了一種嘗試多個隱含搜尋的方法。

  • constValueconstValueOptconstValueTuple
  • S 即將推出

測試

  • testing.typeCheckstesting.typeCheckErrors

斷言

  • byName

即將推出

內聯比對

  • erasedValue

即將推出

Ops (scala.compiletime.ops)

即將推出

此頁面的貢獻者