样式指南

缩进

语言

每个缩进级别为 2 个空格。不使用制表符。因此,不要像这样缩进

// wrong!
class Foo {
    def fourspaces = {
        val x = 4
        ..
    }
}

你应该像这样缩进

// right!
class Foo {
  def twospaces = {
    val x = 2
    ..
  }
}

Scala 语言鼓励大量嵌套作用域和逻辑块(函数值等)。对自己好一点,不要因为打开新块而从语法上惩罚自己。从 Java 过来,这种风格确实需要一点时间来适应,但非常值得付出努力。

换行

有时一个表达式会达到一定长度,以至于将其限制在一行内会变得难以阅读(通常长度在 80 个字符以上)。在这种情况下,首选方法是通过将中间结果分配给值来简单地将表达式拆分为多个表达式。但是,这并不总是一个实用的解决方案。

当绝对有必要将一个表达式换到多行上时,每一行都应该从第一行缩进两个空格。还要记住,Scala 要求每个“换行”要么有一个未闭合的括号,要么以一个右参数未给出的中缀方法结尾

val result = 1 + 2 + 3 + 4 + 5 + 6 +
  7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 +
  15 + 16 + 17 + 18 + 19 + 20

如果没有这个尾随方法,Scala 将在本来打算换行的行的末尾推断出一个分号,有时甚至没有警告就会中断编译。

具有多个参数的方法

在调用采用多个参数(在 5 个或更多范围内)的方法时,通常需要将方法调用包装到多行中。在这种情况下,将每个参数放在一行上,从当前缩进级别缩进两个空格

foo(
  someVeryLongFieldName,
  andAnotherVeryLongFieldName,
  "this is a string",
  3.1415)

这样,所有参数都对齐,但以后更改方法名称时无需重新对齐。

应非常注意避免在行长度内进行此类调用。更具体地说,在每个参数必须缩进 50 个以上空格才能对齐时,应避免进行此类调用。在这种情况下,应将调用本身移到下一行并缩进两个空格

// right!
val myLongFieldNameWithNoRealPoint =
  foo(
    someVeryLongFieldName,
    andAnotherVeryLongFieldName,
    "this is a string",
    3.1415)

// wrong!
val myLongFieldNameWithNoRealPoint = foo(someVeryLongFieldName,
                                         andAnotherVeryLongFieldName,
                                         "this is a string",
                                         3.1415)

更好的是,尽量避免采用超过两个或三个参数的任何方法!

此页面的贡献者