断言的foreach导致宏调用太少参数列表

问题描述 投票:1回答:1

我使用Scala的测试,以检查是否Array包含给定大小的Arrays:

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

这会导致编译错误:

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

虽然的IntelliJ并不表明编译错误。如何测试呢?

arrays scala intellij-idea assert scalatest
1个回答
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(_)这里。