scala - 如何获取一个类型的宏类型参数
问题描述
我正在尝试实现一个宏,它将生成新类,扩展现有类,作为参数给出:
def impl[T: c.WeakTypeTag](c: Context)(p: c.Expr[T]): c.Expr[() => T] = {
val t = weakTypeOf[T]
q"class Too extends $t {..}; () => new Too()"
}
但是尝试运行这样的宏会导致:
[error] Main.scala: exception during macro expansion:
[error] scala.ScalaReflectionException: object com.foo.MyClass in compiler mirror not found.
[error] at scala.reflect.internal.Mirrors$RootsBase.staticClass(Mirrors.scala:129)
[error] at scala.reflect.internal.Mirrors$RootsBase.staticClass(Mirrors.scala:29)
[error] at impl(Macro.scala:54)
解决方案
您似乎没有提供足够的信息来重现您的错误。以下代码在 2.13 中编译没有错误
宏/src/main/scala/Macros.scala
import scala.language.experimental.macros
import scala.reflect.macros.blackbox
object Macros {
def too[T](p: T): () => T = macro impl[T]
def impl[T: c.WeakTypeTag](c: blackbox.Context)(p: c.Expr[T]): c.Expr[() => T] = {
import c.universe._
val t = weakTypeOf[T]
c.Expr[() => T](q"class Too extends $t {}; () => new Too()")
}
}
核心/src/main/scala/App.scala
import Macros._
object App {
class MyClass
too(new MyClass) //App$$$Lambda$3/1967205423@77f03bb1
too(new MyClass)() //App$Too$1@77f03bb1
}
//Warning:scalac: {
// class Too extends App.MyClass {
// def <init>() = {
// super.<init>();
// ()
// };
// <empty>
// };
// (() => new Too())
//}
推荐阅读
- php - 主键值的“字段列表”中的未知列?
- perl - 不寻常的无符号短到位交换字节顺序
- excel - 处理 Application.GetSaveAsFilename 的“否”和“取消”的调试错误
- python - 如何使用纸浆解决具有多个最优解的线性规划问题
- javascript - 在 Chrome 中,提交表单并返回后,其值会在 DOMContentLoaded 后自动填充。是否有可能听到这种变化?
- java - Apache Shiro ThreadContext#bind(Subject) vs ThreadContext.bind(SecurityManager)
- c++ - 如何正确分配我自己班级的地图。例如:地图
- python - 用 Tkinter、Python3 猜数字
- python - 如何比较两个 .csv 和 .xlsx 文件并打印出与特定字段不匹配的内容?
- jmeter - 如何在 JMeter 中为每个用户测试多个并行线程?