gpt4 book ai didi

scala - 在宏扩展时获取封闭类实例

转载 作者:行者123 更新时间:2023-12-03 04:44:40 26 4
gpt4 key购买 nike

我刚刚开始使用宏,想要实现 this 中的宏。

class Queryable[T] {
def map[U](p: T => U): Queryable[U] = macro QImpl.map[T, U]
}
object QImpl {
def map[T: c.WeakTypeTag, U: c.WeakTypeTag]
(c: Context)
(p: c.Expr[T => U]): c.Expr[Queryable[U]] = ...
}

所以我想出了以下版本:

class Query[T](val value: T) {
def map[U](func: T => U): Query[U] = macro Qry.map[T, U]
}

object Qry {
def map[T: c.WeakTypeTag, U: c.WeakTypeTag](c: Context)(func: c.Expr[T => U]): c.Expr[Query[U]] = {
import c.universe._
val q"class Query($value) { ..$body }" = c.enclosingClass
c.Expr[Query[U]](q"new Query($func($value))")
}
}

但它失败并出现 MatchError ,据我了解 enleadingClass 在调用站点捕获它的封闭类,该类在 REPL session 中是生成的模块。那么如何从 Query 类中提取 value 字段并将其传递给 def 宏中的 func 表达式呢?

最佳答案

听起来您正在寻找c.prefix

关于scala - 在宏扩展时获取封闭类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21474249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com