假设我有这个宏:
import language.experimental.macros
import scala.reflect.macros.Context
object FooExample {
def foo[A](xs: A*): Int = macro foo_impl[A]
def foo_impl[A](c: Context)(xs: c.Expr[A]*) = c.literal(xs.size)
}
Run Code Online (Sandbox Code Playgroud)
这与"真正的"varargs一样有效:
scala> FooExample.foo(1, 2, 3)
res0: Int = 3
Run Code Online (Sandbox Code Playgroud)
但是归因于varargs类型的序列的行为让我感到困惑(在Scala 2.10.0-RC3中):
scala> FooExample.foo(List(1, 2, 3): _*)
res1: Int = 1
Run Code Online (Sandbox Code Playgroud)
并且表明推断类型没有任何可疑的事情:
scala> FooExample.foo[Int](List(1, 2, 3): _*)
res2: Int = 1
Run Code Online (Sandbox Code Playgroud)
我原本期望编译时错误,这就是我想要的.我在我编写的大多数宏中使用了以下方法:
object BarExample {
def bar(xs: Int*): Int = macro bar_impl
def bar_impl(c: Context)(xs: c.Expr[Int]*) = {
import c.universe._
c.literal(
xs.map(_.tree).headOption map {
case Literal(Constant(x: Int)) => x …Run Code Online (Sandbox Code Playgroud)