Scala 案例类';复制方法是否使用结构共享?
Scala不可变集合中的结构共享非常简单,有很多材料可以理解它 现在,每个ScalaScala 案例类';复制方法是否使用结构共享?,scala,functional-programming,copy,clone,immutability,Scala,Functional Programming,Copy,Clone,Immutability,Scala不可变集合中的结构共享非常简单,有很多材料可以理解它 现在,每个Scalacase类都自动定义了一个copy方法,该方法返回一个具有指定新属性的新副本,我的问题是,该方法是否使用结构共享 所以当我有一个 case class A(x: HugeObject, y: Int) 并调用copy方法 val a = A(x,y) val b = a.copy(y = 5) 它是否复制x?案例类是平面元组,因此在使用copy时,会为每个产品元素分配一个新实例和插槽。但是,元素本身不是以任何
case类
都自动定义了一个copy
方法,该方法返回一个具有指定新属性的新副本,我的问题是,该方法是否使用结构共享
所以当我有一个
case class A(x: HugeObject, y: Int)
并调用copy
方法
val a = A(x,y)
val b = a.copy(y = 5)
它是否复制x?案例类是平面元组,因此在使用
copy
时,会为每个产品元素分配一个新实例和插槽。但是,元素本身不是以任何形式复制的,而是通过引用共享的(传递到copy
方法的值除外)
因此,在您的例子中,
x
仅作为同一引用重复使用,而不是在结构上重复使用。只是在Repl中尝试了它,它完全正确。对斯威夫特来说,这是一个非常棒的功能。@LukaJacobowitz你说的非常棒的功能是什么意思?明智的做法是不做深度复制。如果你坚持不变的结构,那就是正确有效的工作方式。如果你把可变对象放在一个case类中,那你就错了。这是明智的做法,我认为Scala是如此的一致。使用copy
处理不可变值和处理可变值一样简单。我很困惑,因为你对Swift做了评论,所以假设Swift会复制深层树。哇,对不起,我应该回去工作了。当然意思是Scala:DI实际上并不认为“结构共享”是一个相关的概念。它只是一个浅拷贝,而不是一个深拷贝。结构的整个顶层都被复制了,复制的深度不会超过这个。
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