Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 案例类';复制方法是否使用结构共享?_Scala_Functional Programming_Copy_Clone_Immutability - Fatal编程技术网

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

Scala 案例类';复制方法是否使用结构共享?,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时,会为每个产品元素分配一个新实例和插槽。但是,元素本身不是以任何

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

现在,每个Scala
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