斯卡拉(Scala)中的“简单表达的非法开始”,用于理解if

时间:2019-02-20 16:14:23

标签: scala syntax postfix-operator

我正在实现一个简单的类似于Redis的内存中KeyValue存储,并在以下代码的for comprehension中的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 :(得分:3)

这正是您应谨慎使用后缀运算符的原因。

ThemableControls[i].UpdateTheme((TManager) this);

解析为

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 解释为后缀op:

    zipWithIndex

    ,然后享受功能警告:

      

    警告:应该启用后缀运算符zipWithIndex   通过使隐式值scala.language.postfixOps可见。