foreach 中的断言导致宏调用的参数列表太少
assert in foreach causes too few argument lists for macro invocation
我正在使用 Scala 测试来检查 Array
是否包含给定大小的 Array
s:
result.map(_.length == 2).foreach(assert)
这会导致编译错误:
Error:(34, 39) too few argument lists for macro invocation
result.map(_.length == 2).foreach(assert)
虽然intellij并没有提示编译错误。如何测试?
这只是编译器中的一个错误。您可以使用自己定义的更简单的宏来重现它:
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(_)
。
我正在使用 Scala 测试来检查 Array
是否包含给定大小的 Array
s:
result.map(_.length == 2).foreach(assert)
这会导致编译错误:
Error:(34, 39) too few argument lists for macro invocation
result.map(_.length == 2).foreach(assert)
虽然intellij并没有提示编译错误。如何测试?
这只是编译器中的一个错误。您可以使用自己定义的更简单的宏来重现它:
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(_)
。