在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