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

时间:2017-06-17 18:01:54

标签: scala struct case-class

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

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

3 个答案:

答案 0 :(得分:6)

首先,C ++中的struct和C#中的struct是非常不同的东西。因此,要求Scala中的案例类与那两个没有意义的事情相同。

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

  • C#中的结构是值类型。当作为参数传递时,它们是 复制而不是通过指针传递。此行为类似于a Java中的原始类型。此行为是C ++中的默认行为 classstruct

你的第二个问题已在Eric的回答中得到解答,但重要的一点是C#结构完全按值传递(所有字段都被复制),而Java / C#类则通过指针传递(通过按价值)。如果您需要完整的解释,请参阅this famous post

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

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

  

案例类就像常规类,但有一些关键区别。

this page上了解有关他们的更多信息。

答案 1 :(得分:5)

不是真的。最常见的scala案例类是... scala类。

他们实际上常规scala类,其中包含一些其他方法,这些方法会自动添加到它们中 - 即.copy类本身以及.apply和{{1}在伴侣对象上。他们还获得了一个很好的.unapply方法,列出了所有字段,以及.toString,它们比较实例成员而不是对象引用。

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

答案 2 :(得分:2)

Scala类就像Java类一样。他们的引用按值传递。

Scala case 类就像scala类一样,但有些东西会自动生成:

  • 构造函数的字段是公共可访问的(虽然case类在默认情况下是不可变的,因此您可以将它们视为Java中的public final值,除非您将case类的字段声明为{{1} })
  • 基于构造函数字段的varequals方法
  • 配套对象中的hashCodeapply方法
  • 显示构造函数
  • 的所有值的unapply方法
  • toString方法

以下是一个例子:

copy