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)

即将推出

此页面的贡献者