此文档页面特定于 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)
即将推出