Утверждение в foreach вызывает слишком мало списков аргументов для вызова макроса - PullRequest
0 голосов
/ 07 февраля 2019

Я использую тест 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 делаетне указывает на ошибку компиляции.Как это проверить?

1 Ответ

0 голосов
/ 07 февраля 2019

Это просто ошибка в компиляторе.Вы можете воспроизвести его с помощью более простого макроса, который вы определяете сами:

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(_) здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...