Scala案例类 - 它们只是结构吗?

use*_*285 4 struct scala case-class

所以我刚刚学习了scala案例类,并且我被告知他们习惯于围绕一堆属性提供一个简单的包装器,以便更容易测试相等性.但现在我有两个问题:

  • 这与C++/C#中的结构是一回事吗?
  • 案例类是值类型还是引用类型?

Win*_*ter 6

首先,structC++和structC#中的东西是非常不同的东西.所以问一下scala中的case类是否与那两个没有意义的东西相同.

  • C++中的结构就像常规类一样,但默认情况下,它们的成员是公共的.有关此主题的更多信息,请参阅此帖子.

  • C#中的结构是值类型.当作为参数传递时,它们被深度复制而不是通过指针传递.此行为类似于Java中的基本类型.此行为是C++中的默认行为,使用任何 classstruct.

你的第二个问题已在Eric的回答中得到解答,但重要的是C#结构按值完全传递(所有字段都被复制),而Java/C#类通过指针传递(通过值传递).如果您想要完整的解释,请参阅这篇着名的帖子.

不幸的是,目前JVM字节码中没有真正的值类型.每次传递时都不能创建自己完全复制的类型.答案是否定的,案例类不是像C#结构那样的值类型.JVM语言可能会尝试复制值类型的行为,但它将由GC管理并通过指针(通过值传递)传递.

为了给出更直接的答案,不要:

案例类就像常规类,但有一些关键差异.

详细了解他们在此页面.


Dim*_*ima 6

并不是的.最常见的scala案例类是... scala类.

他们实际上普通Scala类有一些额外的方法,即获得自动添加到他们-即.copy类本身并.apply.unapply同伴对象.他们也得到一个很好的.toString方法,列出所有字段,并且.equals比较实例成员而不是对象ref.

在大多数其他方面,它们只是常规的scala类.