案例类的复制方法是否使用结构共享?

Luk*_*itz 4 functional-programming clone scala copy immutability

Scala不可变集合中的结构共享非常简单,并且有很多材料可以用来理解它.

现在每个Scala都case class自动定义一个copy方法,该方法返回一个带有指定新属性的新副本,我的问题是,该方法是否使用结构共享?

所以,当我有一个

case class A(x: HugeObject, y: Int)
Run Code Online (Sandbox Code Playgroud)

并调用该copy方法

val a = A(x,y)
val b = a.copy(y = 5)
Run Code Online (Sandbox Code Playgroud)

它复制x?

0__*_*0__ 6

案例类是扁平元组,因此当使用copy新实例时,为每个产品元素分配插槽.但是,元素本身不是任何形式的重复,而是通过引用共享(传递给copy方法的值除外).

case class Foo(a: AnyRef, b: AnyRef)

val f1 = Foo(new AnyRef, new AnyRef)
val f2 = f1.copy(a = new AnyRef)
f1.a == f2.a // false
f1.b == f2.b // true
f1.b eq f2.b // true
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,x仅作为相同的参考重用,但在结构上不重复.