case class' 复制方法是否使用结构共享?
Does case class' copy-method use Structural Sharing?
Scala 不可变集合中的结构共享非常简单,有很多 material 可以理解它。
现在每个 Scala case class
自动定义一个 copy
方法,returns 一个新的副本,指定了新的属性,我的问题是,该方法是否使用结构共享?
所以当我有
case class A(x: HugeObject, y: Int)
并调用copy
方法
val a = A(x,y)
val b = a.copy(y = 5)
是否复制 x?
案例 class 是平面元组,因此当使用 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
因此,在您的情况下,x
仅作为相同的引用重复使用,但在结构上没有重复。
Scala 不可变集合中的结构共享非常简单,有很多 material 可以理解它。
现在每个 Scala case class
自动定义一个 copy
方法,returns 一个新的副本,指定了新的属性,我的问题是,该方法是否使用结构共享?
所以当我有
case class A(x: HugeObject, y: Int)
并调用copy
方法
val a = A(x,y)
val b = a.copy(y = 5)
是否复制 x?
案例 class 是平面元组,因此当使用 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
因此,在您的情况下,x
仅作为相同的引用重复使用,但在结构上没有重复。