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

scala中大括号和圆括号的真正区别,scala,elastic4s,Scala,Elastic4s,在使用Scala一段时间后,阅读了各地的相关信息,尤其是 我确信我知道什么时候该用卷发。根据经验,如果我想传递要执行的代码块,我将使用大括号 这个讨厌的bug是如何使用elastic4s DSL出现的 使用大括号: bool { should { matchQuery("title", title) } must { termQuery("tags", category) } } 汇编至: { "bool" : { "must" : {

在使用Scala一段时间后,阅读了各地的相关信息,尤其是

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

这个讨厌的bug是如何使用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 {

回答得很好。这也解释了为什么它在intellij调试程序中工作。bool结构是最烦人的一种,我愿意听取关于如何使它更清晰的建议。另外,另一个问题是将序列与{}结合使用,如果您有一个接受多个参数的方法,比如
bulk
,那么您必须使用()或自己创建一个Seq。