这个问题的动机与我之前的问题相似(尽管它是关于我在不同的上下文中遇到的问题)。
我可以很容易地在函数文字上进行模式匹配,而无需使用 quasiquotes:
import scala.reflect.macros.Context
import scala.language.experimental.macros
object QQExample {
def funcDemo(f: Int => String) = macro funcDemo_impl
def funcDemo_impl(c: Context)(f: c.Expr[Int => String]) = {
import c.universe._
f.tree match {
case Function(ps, body) => List(ps, body) foreach println
case _ => c.abort(
c.enclosingPosition,
"Must provide a function literal."
)
}
c.literalUnit
}
}
像这样工作:
scala> QQExample.funcDemo((a: Int) => a.toString)
List(val a: Int = _)
a.toString()
现在假设我想使用 quasiquotes 更灵活地进行同一种匹配。以下内容也将匹配该函数,并打印我们期望的内容。
case q"($x: $t) => $body" => List(x, t, body) foreach println
但是如果我想在模式中指定类型,它不匹配:
case q"($x: Int) => $body" => List(x, body) foreach println
以下内容甚至都无法编译:
case q"$p => $body" => List(p, body) foreach println
case q"($p) => $body" => List(p, body) foreach println
case q"..$ps => $body" => List(ps, body) foreach println
case q"(..$ps) => $body" => List(ps, body) foreach println
是否可以在使用准引号匹配函数文字时指定参数的类型,或者匹配未知数量的参数?