據我所知,在Scala中,我們可以通過在名稱後面使用空括號或根本沒有括號來定義一個沒有參數的函數,而這兩個定義不是同義詞。區分這兩種語法的目的是什麼?什麼時候應該更好地使用一種而不是另一種?爲什麼要在Scala中使用空括號,如果我們可以不使用括號來定義一個不需要任何參數的函數?
回答
這主要是一個約定的問題。按照慣例,帶有空白參數列表的方法評估其副作用。假定沒有參數的方法是無副作用的。這是公約。
Scala的風格指南說省略括號,只有當被調用的方法沒有任何副作用: http://docs.scala-lang.org/style/method-invocation.html
其他的答案是偉大的,但我也認爲這是值得一提的是無PARAM方法能夠很好的訪問一個類領域,比如:
person.name
由於參數的方法,你可以很容易地編寫攔截方法讀取(或寫)到「姓名」字段不破壞調用代碼,像這樣
def name = { log("Accessing name!"); _name }
這就是所謂的Uniform Access Principal
我還有一個光提請大會鼓勵空括號的有用性功能的聲明塊(因而後來打給他們的電話)與副作用。
它與調試器。
如果在調試器中添加一個手錶,例如process
,該手錶會引用關注的調試環境中的布爾值作爲示例,或者作爲變量視圖,或者作爲純副作用自由函數評估,爲以後的故障排除帶來了嚴重的風險。 事實上,只要你改變上下文(改變線程,移動到調用堆棧,到達另一個斷點...),如果調試器保持這種觀察是一種嘗試評估的事情,我發現至少是這種情況IntelliJ IDEA的,或Visual Studio爲其他語言,然後在任何瀏覽範圍將被觸發可能發現的任何其他process
功能的副作用...
試想那種令人費解的故障排除這可能導致如果你這樣做因爲一些無辜的常規命名,所以沒有想到這個警告。如果慣例被強制執行,在我的示例中,process
布爾評估將永遠不會回調到調試器手錶中的process()
函數調用;它可能只是允許在你的調試器中明確地訪問()函數把process()
放在手錶中,但是很顯然你不直接訪問任何屬性或局部變量,並且回退到其他瀏覽範圍中的其他process()
函數,如果也許是不幸的,至少會不那麼令人驚訝。
- 1. 爲什麼括號需要
- 2. JavaScript即時函數調用 - 爲什麼函數需要括號?
- 3. 是否可以創建一個不需要括號的自定義函數?
- 4. 爲什麼「typeof」不需要括號?
- 5. 爲什麼我需要在RegEx中使用雙曲括號?
- 6. 在某些情況下,爲什麼我們不需要在JavaScript函數定義附近添加一對括號?
- 7. 爲什麼需要兩個括號在c/C++中使用宏?
- 8. 爲什麼我們需要添加括號來評估JSON?
- 9. 爲什麼我的函數需要括號?
- 10. 爲什麼在這個lambda函數週圍需要括號?
- 11. C++構造函數重載 - 爲什麼說我需要括號?
- 12. 爲什麼在這裏需要括號?
- 13. 爲什麼函數裏面的函數不需要括號? JavaScript的?
- 14. 爲什麼C#在表達式中使用可空字符時需要括號?
- 15. 爲什麼IE在我們調用一個函數不接受括號
- 16. 爲什麼打印一個整數的__repr__需要括號?
- 17. 爲什麼要在arity-1方法調用中使用括號括號?
- 18. 爲什麼總和函數的參數需要放在括號內?
- 19. RESTLER:使用括號來指定參數
- 20. 爲什麼我們需要圍繞宏塊的括號?
- 21. 爲什麼JavaScript的eval需要括號來評估JSON數據?
- 22. 使用圓括號代替大括號定義bash函數體
- 23. 爲什麼我的serialVersionUID後需要一個大括號?
- 24. 可能調用單參數Python函數而不使用括號?
- 25. 爲什麼我需要在ES6中用數字括號包裝一些導入?
- 26. 爲什麼函數組合需要括號?
- 27. 我需要在Ruby中使用圓括號來表示嗎?
- 28. 爲什麼使用括號來包裝javascript函數調用?
- 29. 爲什麼numpy.r_使用括號而不是括號?
- 30. 如何正確使用強制使得不需要括號?
那麼,你會怎麼做一個工廠方法?你會寫'def createAccount:Account'或'def createAccount():Account'? – David 2010-10-07 01:53:19
對於完全習慣的Scala,工廠方法通常寫在伴侶對象上,並命名爲「apply」。然後,您可以使用apply:Account(args)的特殊語法創建對象。 – 2010-10-07 03:09:38
無論空參數列表如何,編譯器都會接受重寫定義:http://pastie.org/1204728。在Language Specification中查找字符串「空參數列表」。 – mkneissl 2010-10-07 06:29:54