在foreach中声明会导致用于宏调用的参数列表太少

时间:2019-02-07 18:29:27

标签: arrays scala intellij-idea assert scalatest

我正在使用scala测试来检查Array是否包含给定大小的Array

result.map(_.length == 2).foreach(assert)

这会导致编译错误:

Error:(34, 39) too few argument lists for macro invocation
    result.map(_.length == 2).foreach(assert)

尽管intellij不指示编译错误。如何测试?

1 个答案:

答案 0 :(得分:3)

这只是编译器中的错误。您可以使用自己定义的更简单的宏来重现它:

scala> import scala.language.experimental.macros
import scala.language.experimental.macros

scala> import scala.reflect.macros.blackbox.Context
import scala.reflect.macros.blackbox.Context

scala> object IncrementMacro { def inc(c: Context)(i: c.Expr[Int]) = i }
defined object IncrementMacro

scala> object Increment { def inc(i: Int): Int = macro IncrementMacro.inc }
defined object Increment

scala> List(1, 2, 3).map(Increment.inc)
<console>:15: error: too few argument lists for macro invocation
       List(1, 2, 3).map(Increment.inc)
                                   ^

scala> List(1, 2, 3).map(Increment.inc _)
<console>:15: error: macros cannot be eta-expanded
   List(1, 2, 3).map(Increment.inc _)
                               ^

scala> List(1, 2, 3).map(Increment.inc(_))
res1: List[Int] = List(1, 2, 3)

这是2.12.8,但我想我记得在2.10天内第一次注意到这一点。可能有一个问题,也可能没有,但是故事的寓意是,Scala的宏与其他语言功能(例如eta扩展)以怪异的方式交互,在我看来,您最好只是记住解决方法,例如这里的assert(_)