Scala中花括号和圆括号的真正区别

3

使用Scala一段时间后,阅读了很多关于它的文章,特别是这里,我确信自己知道何时使用花括号。作为一个经验法则,如果我想传递一个要执行的代码块,我会使用花括号。

然而,使用弹性搜索DSL时出现了一个令人讨厌的bug,使用花括号:

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调试器中评估表达式无论我使用什么都会得到正确的结果。我注意到只有最后一个表达式被评估了,为什么会这样?
1个回答

8

可能问题不在括号,而在于中缀表示法。请查看以下行:

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

must 必须放在下一行,这样它就会被解释为新的表达式而不是 should 的延续。你可能需要将它与闭括号放在同一行。

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

很棒的答案。同时解释了为什么在IntelliJ调试器中可以工作。 - raam86
1
布尔构造是最令人讨厌的之一,我愿意听取如何使其更清晰的建议。另一个需要注意的问题是使用{}序列,如果您有一个接受多个参数的方法,比如bulk,那么您必须使用()或创建一个Seq。 - sksamuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接