此文档页面特定于 Scala 2 中提供的功能,这些功能已在 Scala 3 中删除或被替代方案取代。除非另有说明,本页面中的所有代码示例均假定你使用的是 Scala 2。
实验性
Eugene Burmako
宏包是 Scala 2.11.x 和 Scala 2.12.x 的一项功能。Scala 2.10.x 中不支持宏包。它们也不受 Scala 2.10.x 的宏天堂支持。
宏包
在 Scala 2.10.x 中,宏实现用函数表示。一旦编译器看到宏定义的应用,它就会调用宏实现 - 如此简单。然而,实践表明,由于以下原因,仅使用函数通常不够
-
仅限于函数会使模块化复杂宏变得尴尬。通常会看到宏逻辑集中在宏实现之外的辅助特征中,将实现变成琐碎的包装器,它只是实例化并调用辅助函数。
-
此外,由于宏参数依赖于宏上下文的路径,因此需要 特殊咒语 来将实现和辅助函数连接在一起。
宏包通过允许在将 c: scala.reflect.macros.blackbox.Context
或 c: scala.reflect.macros.whitebox.Context
作为其构造函数参数的类中声明宏实现,为这些问题提供了解决方案,从而使宏实现不必在其签名中声明上下文,这简化了模块化。引用在包中定义的宏实现的方式与在对象中定义的实现相同。你指定一个包名称,然后从中选择一个方法,并在必要时提供类型参数。
import scala.reflect.macros.blackbox.Context
class Impl(val c: Context) {
def mono = c.literalUnit
def poly[T: c.WeakTypeTag] = c.literal(c.weakTypeOf[T].toString)
}
object Macros {
def mono = macro Impl.mono
def poly[T] = macro Impl.poly[T]
}
黑盒与白盒
宏包可用于实现 黑盒 和 白盒 宏。向宏包构造函数参数提供 scala.reflect.macros.blackbox.Context
类型以定义黑盒宏,并提供 scala.reflect.macros.whitebox.Context
类型以定义白盒宏。