一般來說,Scala 中的方法呼叫遵循 Java 慣例。換句話說,呼叫目標和點 (.
) 之間不應有空格,點和方法名稱之間也不應有空格,方法名稱和引數分隔符號 (括號) 之間也不應有空格。每個引數應以一個空格分隔,並置於逗號 (,
) 之後
foo(42, bar)
target.foo(42, bar)
target.foo()
從 2.8 版開始,Scala 現在支援命名參數。方法呼叫中的命名參數應視為一般參數 (依逗號後適當的空格) 處理,等號兩側各有一個空格
foo(x = 6, y = 7)
雖然這種風格在命名參數和變數指派上會造成視覺上的模糊,但另一種方式 (等號周圍沒有空格) 會導致程式碼難以閱讀,特別是實際參數的非平凡表達式。
元數 0
Scala 允許省略元數為 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)
經驗表明,這些樣式會讓程式碼更難閱讀,特別是在多個此類方法呼叫連結時。