此文件頁面專屬於 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
參數,第二種是使用 summonInline
、summonAll
或 summonFrom
之一。 using
會在呼叫點內聯之前召喚值,就像該方法不是 inline
一樣。另一方面,如果呼叫未從死路徑中消除,summonInline
會在內聯後召喚。 summonAll
提供了一種從元組類型同時召喚多個值的方法。 summonFrom
提供了一種嘗試多個隱含搜尋的方法。
值
constValue
、constValueOpt
和constValueTuple
S
即將推出
測試
testing.typeChecks
和testing.typeCheckErrors
斷言
byName
即將推出
內聯比對
erasedValue
即將推出
Ops (scala.compiletime.ops)
即將推出