簡體   English   中英

Scala - 中綴vs點符號

[英]Scala - infix vs dot notation

一個是另一個最好的做法嗎? 我一直在閱讀Odersky等人 Scala書。 似乎infix用於很多Collections API函數,而dot則保留給程序員定義的函數。

我個人對此沒有任何嚴格的規則,但我傾向於僅使用符號方法名稱的中綴符號,以及字母數字符號的點符號。

中綴表示法使得稍后修改代碼變得很麻煩。 這里有些例子。

想象一下,你有這行代碼:

xs filter { f } map { g }

假設在后一個時間點你需要在末尾添加一個toList 你這么說:

xs filter { f } map { g } toList

這可能會導致分號推斷問題。 要避免這些問題,您可以在結尾處添加分號,也可以添加新行。 在我看來,這兩種選擇都很難看。 為了避免所有這些廢話,我更喜歡使用xs.filter(f).map(g) 使用這種語法重構總是更容易。

另一個例子:說我的代碼中有以下內容:

if(foo contains bar) { ..

說,我需要否定這個條件。 如果我修改如下:

if(!foo contains bar) { ..

游民。 這被解析為(!foo).contains(bar) 不是我們想要的。

或者假設您需要另外添加新條件,並將其修改為:

if(foo contains bar && cond) { ..

另一個無賴。 這被解析為foo.contains(bar.&&(cond)) 不是我們想要的,再一次。

當然,你可以添加一堆括號,但與點符號相比,這將是丑陋的,難以閱讀/編輯。

現在,我上面說的所有內容也適用於符號方法名稱。 但是,當使用點語法時,符號方法看起來不自然,所以我更喜歡它們的中綴語法。


上述指南的一個例外:內部DSL。 它們通常經過精心設計,以便在按照其文檔/示例(通常使用中綴表示法)中規定的方式編寫時不會導致解析問題。

這是個人喜好的問題。 您決定使用一種風格或另一種風格應該基於使您的代碼最具可讀性的原因。

但請注意,忽略點和圓括號的能力僅限於某些句法結構,因此有時您只需要回退使用它們。

官方Scala站點文檔中有一個很好的樣式指南 ,用點符號描述正確的使用中綴符號。

后綴表示法:

names.toList
// is the same as
names toList // Unsafe, don't use!

元數的1:

// right!
names foreach (n => println(n))
names mkString ","
optStr getOrElse "<empty>"
// wrong!
javaList add item

高階函數:

// wrong!
names.map (_.toUpperCase).filter (_.length > 5)
// right!
names map (_.toUpperCase) filter (_.length > 5)

符號方法/操作符:

// right!
"daniel" + " " + "Spiewak"
// wrong!
"daniel"+" "+"spiewak"

我發現當我使用庫創建笛卡兒時,使用中綴符號可以很好地使用map 例如:

(fetchIt(1) |@| fetchIt(2) |@| fetchIt(3)).map(MyCaseClass)

你可以像這樣擺脫周圍的括號:

fetchIt(1) |@| fetchIt(2) |@| fetchIf(3) map MyCaseClass

在我看來,第二個變體讀得更好。 我想是一個品味問題。 只是想加上我的兩分錢。

上述作品因為| 在“| @ |” 在“map”中具有比m更高的優先級。 閱讀Scala lang規范的這一部分以了解更多詳細信息:

如果表達式中有多個中綴操作,則優先級較高的運算符比優先級較低的運算符綁定得更緊密。

http://scala-lang.org/files/archive/spec/2.12/06-expressions.html#infix-operations

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM