英文原文:​http://docs.scala-lang.org/style/

译文如下:


所有的控制结构应该在定义关键字之后写入一个空格:

// right!
if (foo) bar else baz
for (i <- 0 to 10) { ... }
while (true) { println("Hello, World!") }

// wrong! if ( foo ) bar else baz for ( i <- 0 to 10 ) { ... } while ( true ) { println ( "Hello, World!" ) }

一、大括号

在控制结构表示纯功能操作的情况下应省略花括号,并且控制结构的所有分支(与​​if​​/ 相关​​else​​)为单行表达式)。请记住以下准则:​​if​

  • - 如果您有一个

​else​

  • 子句,请省略大括号。否则,即使内容只是一行,也可以用大括号包围内容。

​while​

  • - 不要省略大括号(

​while​

  • 不能以纯粹的功能使用)。

​for​

  • - 如果您有一个

​yield​

  • 子句,请省略大括号。否则,即使内容只有一行,也可以用卷曲括住内容。

​case​

  •  - 总是省略括号中的大括号。
val news = if (foo)
goodNews()
else
badNews()

if ( foo ) { println ( "foo was true" ) } news match { case "good" => println ( "Good news!" ) case "bad" => println ( "Bad news!" )

二、推导

Scala有能力​​for​​用多个生成器(通常多于一个​​<-​​符号)表示 - 解释。在这种情况下,可以使用两种可选的语法:

// wrong!
for (x <- board.rows; y <- board.files)
yield (x, y)

// right! for { x <- board . rows y <- board . files } yield ( x , y )虽然后一种风格更为冗长,但通常认为阅读更容易,更具有“可扩展性”(意味着它不会随着理解的复杂性增加而变得混淆)。您应该更喜欢这种形式来​​for​​解释多个生成器。仅使用单个发生器(例如​​for (i <- 0 to 10) yield i​​)的理解 应使用第一个形式(括号而不是花括号)。这个规则的例外是​​for​​缺少一个​​yield​​子句的理解 。在这种情况下,构造实际上是一个循环而不是一个功能的理解,而且通常更容易将生成器在括号之间串起来,而不是使用语法上混淆的​​} {​​结构:

// wrong!
for {
x <- board.rows
y <- board.files
} {
printf("(%d, %d)", x, y)
}

// right! for ( x <- board . rows ; y <- board . files ) { printf ( "(%d, %d)" , x , y )最后,​​for​​内涵是首选链式调用​​map​​, ​​flatMap​​和​​filter​​,因为这样可以得到难以阅读(这是增强的目的之一​​for​​理解)。

三、不重要的条件

在某些情况下,在更大的表达式中创建用于嵌套使用的简短​​if​​/ ​​else​​表达是有用的 。在Java中,这种情况传统上由Scala缺少的语法操作符(​​?​​/ ​​:​​)处理。在这些情况下(真的任何时候你有一个非常简短的​​if​​/ ​​else​​ 表达式)允许将“then”和“else”分支放在​​if​​与​​else​​关键字相同的行上:

val res = if (foo) bar else baz

这里的关键是通过将两个分支与​​if​​/一起内联移动来阻止可读性​​else​​。请注意,此风格不应与命令式​​if​​表达式一起使用,也不应使用花括号。