风格指南

方法调用

语言

一般来说,Scala 中的方法调用遵循 Java 惯例。换句话说,调用目标和点之间不应该有空格 (.),点和方法名之间也不应该有空格,方法名和参数分隔符(括号)之间也不应该有空格。每个参数都应该用一个空格分隔,这个空格位于逗号 (,) 之后

foo(42, bar)
target.foo(42, bar)
target.foo()

从 2.8 版本开始,Scala 现在支持命名参数。方法调用中的命名参数应视为常规参数(在逗号后相应地加上空格),等号两侧各加一个空格

foo(x = 6, y = 7)

虽然这种风格确实在命名参数和变量赋值中造成了视觉上的歧义,但另一种方式(等号周围没有空格)会导致代码非常难以阅读,特别是对于实际参数的非平凡表达式。

arity-0

Scala 允许省略 arity-0(无参数)方法上的括号

reply()

// is the same as

reply

但是,这种语法在所讨论的方法没有副作用(纯函数)时才应使用。换句话说,在调用 queue.size 时省略括号是可以接受的,但在调用 println() 时则不行。此约定反映了上面给出的方法声明约定。

遵守此约定可提高代码可读性,并且可以一目了然地更轻松地理解任何给定方法的最基本操作。不要为了节省两个字符而抑制省略括号的冲动!

元数 1(中缀表示法)

Scala 具有用于调用元数 1(一个参数)方法的特殊无标点符号语法。通常应避免这样做,但对于运算符和高阶函数有以下例外。在这些情况下,它仅应用于纯函数方法(没有副作用的方法)。

// recommended
names.mkString(",")

// also sometimes seen; controversial
names mkString ","

// wrong - has side-effects
javaList add item

符号方法/运算符

符号方法(运算符)应始终使用中缀表示法调用,并在目标、运算符和参数之间用空格分隔

// right!
"daniel" + " " + "spiewak"
a + b

// wrong!
"daniel"+" "+"spiewak"
a+b
a.+(b)

在大多数情况下,此惯用语遵循 Java 和 Haskell 语法约定。一个灰色区域是类似于 max 的短运算符方法,特别是如果可交换

// fairly common
a max b

不建议使用采用多个参数的符号方法。当它们存在时,仍可以使用中缀表示法调用它们,并用空格分隔

foo ** (bar, baz)

但是,这种方法相当罕见,通常应在 API 设计期间避免使用。例如,应避免使用(现已弃用的)/::\ 方法,而应优先使用它们更知名的名称 foldLeftfoldRight

高阶函数

调用高阶函数可以使用括号或大括号,但在任何情况下,都应使用点表示法并在方法名称后省略任何空格

names.map(_.toUpperCase)

不建议这样做

// wrong! missing dot
names map (_.toUpperCase)
// wrong! extra space
names.map (_.toUpperCase)

经验表明,这些样式会使代码更难阅读,尤其是在链接多个此类方法调用时。

此页面的贡献者