scala中大括号和圆括号的真正区别

Real difference between curly braces and parenthesis in scala

在使用 Scala 一段时间并到处阅读之后,尤其是 here

我确信我知道什么时候使用卷曲。根据经验,如果我想传递要执行的代码块,我将使用大括号。

这个讨厌的错误是如何使用 elastic4s DSL 浮出水面的 使用花括号:

bool {
  should {
    matchQuery("title", title)
  }
  must {
    termQuery("tags", category)
  }
}

编译为:

{
  "bool" : {
    "must" : {
      "term" : {
        "tags" : "tech"
      }
    }
  }
}

使用括号时:

bool {
       should (
         matchQuery("title", title)
        ) must (
         termQuery("tags", category)
        )
      }

给出正确的结果:

{
  "bool" : {
    "must" : {
      "term" : {
        "tags" : "tech"
      }
    },
    "should" : {
      "match" : {
        "title" : {
          "query" : "fake",
          "type" : "boolean"
        }
      }
    }
  }
}

这是使用 scala 2.11.6 编译的——更令人困惑的是,无论我使用什么,在 intellij 调试器中评估表达式都会给出正确的结果。

我注意到只计算了最后一个表达式,这是为什么?

问题可能不在大括号中,而在中缀表示法中。看行

  should {
    matchQuery("title", title)
  }
  must {

must 进入下一行,因此它被解释为新表达式而不是 should 的延续。您可能必须将它与右大括号

放在同一行
  should {
    matchQuery("title", title)
  } must {