Скала "Незаконное начало простого выражения" в для понимания с, если - PullRequest
0 голосов
/ 20 февраля 2019

Я нахожусь в процессе реализации простого в памяти Redis-подобного хранилища KeyValue и испытываю ошибку компиляции в операторе if в следующем фрагменте кода для понимания:

  /*
  Returns the specified elements of the list stored at key. The offsets start and
  stop are zero-based indexes, with 0 being the first element of the list to n. */

  def lrange(k: keyT, maxIdx:Int, minIdx:Int): List[valT] = {
    val l = lookup(k)
    //assert(maxIdx >= minIdx && maxIdx <= (l length) && minIdx >= 0, "invalid min or max argument. list size ")
    for {
      (x: valT, i: Int) <- l zipWithIndex      //tried without explicit typing
      if i <= maxIdx && i >= minIdx            //tried indenting if
    } yield x
  }

Редактор(IntelliJ) не показывает ошибок, но я получаю следующую ошибку сборки при попытке построить и запустить тесты.

[INFO] --- scala-maven-plugin:3.3.2:compile (default) @ DS4300Project3 ---
[INFO] .../Spring2019/DS4300/scala/DS4300Project3/src/main/scala:-1: info: compiling
[INFO] Compiling 3 source files to .../Spring2019/DS4300/scala/DS4300Project3/target/classes at 1550678144065
[ERROR] .../Spring2019/DS4300/scala/DS4300Project3/src/main/scala/com/rejevichb/homework3/KeyValStore.scala:70: error: illegal start of simple expression
[ERROR]       if (i <= maxIdx) && (i >= minIdx) //tried indenting if
[ERROR]       ^
[ERROR] one error found
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

В частности:

KeyValStore.scala:70: error: illegal start of simple expression

Любое руководство или понимание того, что здесь происходит, приветствуется, так как решение мне не ясно.

1 Ответ

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

Именно поэтому вы должны использовать постфиксные операторы с осторожностью.

for {
  i <- "a" zipWithIndex
  if true
} yield i

анализируется как

for { i <- ("a" zipWithIndex if true) } yield i

, поскольку компилятор пытается интерпретировать zipWithIndex как двоичный файлинфиксный оператор, но затем встречается с if true, что на самом деле не является простым выражением.

Обходные пути:

  • просто не используйте операции постфикса, используйте точку:

    for {
      i <- "a".zipWithIndex
      if true
    } yield i
    
  • добавьте точку с запятой в zipWithIndex для интерпретации как постфиксный код операции:

    for {
      i <- "a" zipWithIndex;
      if true
    } yield i
    

    и затем получите предупреждение о функции:

    предупреждение: постфиксный оператор zipWithIndex должен быть включен, сделав видимым неявное значение scala.language.postfixOps.

...