所以我刚刚学习了scala案例类,并且我被告知它们习惯于围绕一堆属性提供一个简单的包装器,以便更容易测试相等性。但现在我有两个问题:
答案 0 :(得分:6)
首先,C ++中的struct
和C#中的struct
是非常不同的东西。因此,要求Scala中的案例类与那两个没有意义的事情相同。
C ++中的结构就像常规类一样,但默认情况下是它们的成员 是公开的。有关此主题的更多信息,请参阅this post。
C#中的结构是值类型。当作为参数传递时,它们是
复制而不是通过指针传递。此行为类似于a
Java中的原始类型。此行为是C ++中的默认行为
class
或struct
。
你的第二个问题已在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类一样,但有些东西会自动生成:
public final
值,除非您将case类的字段声明为{{1} })var
和equals
方法hashCode
和apply
方法unapply
方法
toString
方法以下是一个例子:
copy