在Scala中,您不需要使用「new」來創建新的「case class」的原因是什麼? 我試圖尋找一段時間沒有答案。爲什麼「case class」不需要「new」來創建新對象
12
A
回答
37
你想要的如何或爲什麼?正如其他答案註釋,如何只是apply
方法在自動生成的隨播對象上。
對於爲什麼:case類經常被用來在Scala中實現algebraic data types,並且new
稀少構造函數允許代碼,更優雅(創建值看起來更像經由模式匹配解構它,例如)和更接近於其他語言中的ADT語法。
14
案例類具有apply()
實施的預建伴侶對象。甚至有人抱怨這一點:How to override apply in a case class companion :)
1
案例分類爲您提供一個自動生成的apply
函數,您可以像構造函數一樣使用它們的伴隨對象。
在斯卡拉反編譯字節代碼,你會發現,如下創建apply
功能:
object Person {
def apply(name: String, age: Integer): Person = new Person(name,age)
}
例子:
case class Person(name: String, age: Integer)
下面三個都做同樣的事情。
val p0 = new Person("Frank", 23) // normal constructor
val p1 = Person("Frank", 23) // this uses apply
val p2 = Person.apply("Frank", 23) // using apply manually
所以如果你使用val p1 = Person("Frank", 23)
它不是一個構造,這個調用應用方法的方法。
更多信息請閱讀scala-object-apply-functions。
相關問題
- 1. 爲什麼我需要'新'來創建一個對象?
- 2. 創建新對象時,爲什麼要更新舊對象?
- 3. 爲什麼我不需要創建一個對象?
- 4. 爲什麼你不需要在Java中創建對象?
- 5. 爲什麼不使用class-keyword不能創建對象?
- 6. 爲什麼case class被命名爲'case'?
- 7. 爲什麼jQuery使用「new jQuery.fn.init()」來創建jQuery對象,但我不能?
- 8. 爲什麼要創建模擬對象?
- 9. 爲什麼我們要從Interface而不是Class創建對象實例?
- 10. 爲什麼我們需要創建模擬對象?
- 11. 使用類創建對象,爲什麼我需要__init __(self,args):?
- 12. 爲什麼元素創建需要DOM中的文檔對象?
- 13. 爲什麼只有我真的需要創建兩個對象?
- 14. JavaScript:爲什麼我的`new`需要parens?
- 15. 爲什麼我們不需要爲靜態方法創建對象?
- 16. 爲什麼在VB6中創建新的Crystal Report對象需要很長時間?
- 17. 爲什麼要創建一個新的對象 - Java Tetris教程
- 18. 爲什麼要創建一個新的委託對象
- 19. Rails用param創建對象 - 不需要
- 20. 爲什麼不需要重新分配一些對象?
- 21. 爲什麼不創建一個對象?
- 22. 爲什麼需要Thread .__ init __()在Class中?
- 23. 創建對象時,Class()vs self .__ class __()
- 24. 無法創建「Class」對象
- 25. 要列出的對象 - >爲什麼我必須創建一個新對象?
- 26. 創建新Activity時,爲什麼我們需要將EditText對象轉換爲EditText對象?
- 27. 爲什麼需要額外的對象?
- 28. 爲什麼需要ListModel對象?
- 29. 爲什麼C++ new不返回指向它創建的對象的指針?
- 30. 爲什麼DBIx :: Class不能創建多對多訪問器?
謝謝你,這就是我要找的:) – 2012-08-03 16:29:18