2017-04-16 58 views
2

我總是想知道爲什麼Scala的設計能夠省略圓點和圓括號。這讓我困惑。例如,編寫Scala代碼時忽略點和括號是否是一種好習慣?

"hello".length() can be written as 
"hello".length 

它造成混亂:在C++程序員的角度來看,

"hello".length() is calling the object's length() function 
"hello".length is calling the object's private/public variable. 

它們是不同的。

而且,它是有線沒有點讀這樣的代碼:

它看起來像句子還沒有完成。它也不節省空間,我們仍然必須使用空白而不是「。」。

斯卡拉設計師「發明」這種遺漏的目的是什麼?我們鼓勵使用這種風格嗎?

回答

8

在第一種情況下,是的。沒有參數且沒有副作用的方法推薦使用而沒有括號。如果有副作用使用括號。

想法是,如果length是一種方法或直接訪問屬性,則無關緊要。無論哪種方式,它只是給你的長度,並沒有什麼根本的區別,你正在做什麼,只是得到一個價值,並沒有關係它被定義。按照慣例,括號表明有一些副作用正在進行,如打印到標準輸出或變異值。

對於第二個例子,是的,編寫這樣的代碼會非常奇怪,但中綴符號可能非常有用。

例如,您可以編寫1 + 2而不是1.+(2)。我認爲你可以同意第一個是可取的。它也爲編寫好看的DSL提供了可能性,這些DSL不需要點和圓括號這是目標之一。然而,在典型使用中,我會避​​免使用非符號(英文)方法。

1

括號的可選的使用是因爲它規定了uniform access principle的:

由模塊提供的所有服務應該是可以通過一個統一的 符號,不辜負他們是否通過 存儲實現或通過計算

在實踐中,這意味着,用於操作屬性(存儲)和方法(計算)的語法應該是相同的

這個原理也帶來了一些問題:如果你正在訪問一個需要昂貴計算的值(例如一個繁重的數據庫查詢)並且你沒有意識到成本,那麼系統可能會變得很慢。

有時你不關心下面的實現,有時你必須意識到它。

相關問題