为什么在括号上使用花括号?

时间:2014-07-03 12:22:09

标签: scala language-design

在很多Scala示例中,我看到人们在我发现完全奇怪的地方使用花括号,当使用括号可以很容易地写出相同的语句时。

示例:

lst foreach (x => println(s"the value returned is: $x")) // parens
lst foreach {x => println(s"you get the idea, $x")} // braces

我知道你可以使用大括号作为括号的替代,只是因为它允许你在多行上写一个语句:

val res = for {
  x <- coll1
  y <- coll2
} yield (x, y) 
  • 所以当它写在一行上时,是否有任何固有的理由使用一个而不是另一个?
  • 结果最终应该是一样的,还是我错过了什么?
  • 或者只是风格和/或个人品味的问题?

3 个答案:

答案 0 :(得分:13)

一般来说,在很多情况下你更喜欢花括号(例如多线表达式,用于理解),但是让我们特别谈谈

当它写在一行上时,是否存在使用其中一个的固有原因

在第二种情况下,它不仅仅是花括号,而不是括号,它的带有括号括号的花括号。 Scala允许你有时省略括号,后面的语法用于访问你在部分函数中得到的细节(即模式匹配),所以

lst foreach {x => println(s"you get the idea, $x")}

实际上是

lst foreach({x => println(s"you get the idea, $x")})

正如我所说,它可以从模式匹配POV中获得:

val map = Map("foo" -> "bar")
map foreach { case (k, v) => println(s"key: $k, value: $v") }
// which is not possible with the usual parenthesis

答案 1 :(得分:2)

这是编码风格的问题。看看http://www.codecommit.com/scala-style-guide.pdf

如果您传递的函数是单个表达式,则可以使用其中任何一个,结果将是相同的。但是,如果函数包含多个表达式,则必须使用大括号。出于这个原因,我总是喜欢使用牙箍,除了我发现它使你的意图更清晰的事实。 (注意我们说的是单个表达式,而不是单行。例如:

lst map (x => findInDatabase(x)
               .getOrElse(ERROR_VALUE))

会很好(因为findInDatabase(x).getOrElse(ERROR_VALUE)是单个表达式,即使它被分成多行。

此外,如果函数当前是单个表达式,稍后您需要将其更改为多个表达式,则必须记住将括号更改为大括号(还有一件事需要记住)。

答案 2 :(得分:0)

当函数只接受一个参数时,您只能使用花括号。这个想法是让方法调用更像是一个控件抽象。 所以是的,你是对的,这真的是一种风格问题。