一般来说,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 设计期间避免使用。例如,应避免使用(现已弃用的)/:
和 :\
方法,而应优先使用它们更知名的名称 foldLeft
和 foldRight
。
高阶函数
调用高阶函数可以使用括号或大括号,但在任何情况下,都应使用点表示法并在方法名称后省略任何空格
names.map(_.toUpperCase)
不建议这样做
// wrong! missing dot
names map (_.toUpperCase)
// wrong! extra space
names.map (_.toUpperCase)
经验表明,这些样式会使代码更难阅读,尤其是在链接多个此类方法调用时。