所以我在扩展方法中有一个方法应该扩展为宏。我遇到的问题是如何在宏实现调用中包含扩展方法的接收器?
implicit class ExtensionTest(xs: List[Int]) {
def foo(fun: Int => Int)(implicit ord: Ordering[Int]): List[Int] =
macro ExtensionTest.fooImpl // how to pass `xs`?
}
object ExtensionTest {
def fooImpl(c: blackbox.Context)
(fun: c.Expr[Int => Int])
(ord: c.Expr[Ordering[B]]): c.Expr[List[Int]] = ???
}
答案 0 :(得分:2)
这里的解决方案是“找到”xs
到c.prefix
,它指向ExtensionTest
的实例:
implicit class ExtensionTest(val xs: List[Int]) {
def foo(fun: Int => Int)(implicit ord: Ordering[Int]): List[Int] =
macro ExtensionTest.fooImpl
}
object ExtensionTest {
def fooImpl(c: blackbox.Context)(fun: c.Expr[Int => Int])
(ord: c.Expr[Ordering[Int]]): c.Expr[List[Int]] = {
import c.universe._
reify {
c.prefix.splice.asInstanceOf[ExtensionTest].xs.map(fun.splice).sorted(ord.splice)
}
}
}
测试:
assert(List(6, 1, 7, 4).foo(_ + 2) == List(3, 6, 8, 9))