支持或不支持:case语句块

时间:2014-05-23 18:58:37

标签: scala coding-style

我在这里问一个具体的问题(不是意见):是否有针对以下情况的scala风格指南推荐"案例o:"解决是否要避免(可选)使用牙箍,或者是否可以使用牙箍:

 def mycase(x : Int) = {
      x match {
      case 0 =>
        println("zero")
        println("blah zero")
      case 1 =>
        println("one")
      }

我最初并不相信它会工作(认为它可能会失败):但是它确实是正确的突破:

scala> mycase(0)
zero
blah zero

我特别想知道是否有一个规范的答案(不是#34;我更喜欢"等等)。例如。对于java,Sun很久以前曾说过,为方法放置初始大括号可能会在同一行或下一行上发生 - 两者都可以接受。在这种情况下有这么明确的答案吗?

更新 @acjay在下面提供的答案提供了指向样式指南的链接。这里面是一个特定的模糊。

来自http://docs.scala-lang.org/style/control-structures.html#curlybraces

  

case - 如果case表达式适合单行,则省略大括号。   否则,为清晰起见使用花括号(即使它们不是   解析器所需的。)

3 个答案:

答案 0 :(得分:11)

关于此http://docs.scala-lang.org/style/control-structures.html#curly-braces的Scala风格指南似乎已更改,其中显示

  

case - 在case子句中总是省略大括号。

实际上,在IntelliJ中进行编辑时,它会提醒用户在大小写块周围不必要的大括号。

因此,为了避免对用户造成进一步的混淆,请对接受的答案进行更正:)

答案 1 :(得分:4)

Scala Documentation Style Guide说:

  

case - 如果case表达式适合单行,则省略大括号。   否则,为清晰起见使用花括号(即使它们不是   解析器所需的。)

因此,正确的格式是:

def mycase(x : Int) = x match {
  case 0 => {
    println("zero")
    println("blah zero")
  }
  case 1 => println("one")
}

与问题分开,但与给出的示例相关,样式指南的the declarations section提到了match的首选格式:

  

包含单个匹配表达式的方法应按以下方式声明:

def sum(ls: List[Int]): Int = ls match {
  case hd :: tail => hd + sum(tail)
  case Nil => 0
}

答案 2 :(得分:0)

关于花括号的相同/下一行,Style Guide is explicit也是如此:

  

打开花括号({)必须与声明位于同一行   他们代表:

def foo = {   
  ...
}
  

从技术上讲,Scala的解析器确实支持GNU风格的表示法   在声明后的行上打开括号。然而   因为处理这种风格,解析器不是非常可预测的   半结肠推理的实现方式。很多头痛   将通过简单地遵循大括号约定来保存   如上所述。