英文原文:http://docs.scala-lang.org/style/
译文如下:
所有的控制结构应该在定义关键字之后写入一个空格:
// 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
- - 总是省略括号中的大括号。
if
(
foo
)
{ println
(
"foo was true"
) }
news match
{
case
"good"
=>
println
(
"Good news!"
)
case
"bad"
=>
println
(
"Bad news!"
)
二、推导
Scala有能力for
用多个生成器(通常多于一个<-
符号)表示 - 解释。在这种情况下,可以使用两种可选的语法:
// right! for
{ x
<-
board
.
rows y
<-
board
.
files }
yield
(
x
,
y
)虽然后一种风格更为冗长,但通常认为阅读更容易,更具有“可扩展性”(意味着它不会随着理解的复杂性增加而变得混淆)。您应该更喜欢这种形式来for
解释多个生成器。仅使用单个发生器(例如for (i <- 0 to 10) yield i
)的理解 应使用第一个形式(括号而不是花括号)。这个规则的例外是for
缺少一个yield
子句的理解 。在这种情况下,构造实际上是一个循环而不是一个功能的理解,而且通常更容易将生成器在括号之间串起来,而不是使用语法上混淆的} {
结构:
// 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
关键字相同的行上:
这里的关键是通过将两个分支与if
/一起内联移动来阻止可读性else
。请注意,此风格不应与命令式if
表达式一起使用,也不应使用花括号。