Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
Class 以惯用方式创建不可变实例和修改副本_Class_Scala_Copy_Immutability_Case - Fatal编程技术网

Class 以惯用方式创建不可变实例和修改副本

Class 以惯用方式创建不可变实例和修改副本,class,scala,copy,immutability,case,Class,Scala,Copy,Immutability,Case,我希望根据对象实例外部的信息有条件地创建对象实例的副本。副本中的大部分信息与原件相同,但部分信息需要更改。这些信息在参与者之间传递,因此我需要对象是不可变的,以避免奇怪的并发相关行为。下面的玩具代码是一个简单的例子,我想得到一些帮助 如果我有以下代码: case class Container(condition:String,amount:Int,ID:Long) 我可以做到以下几点: val a = new Container("Hello",10,1234567890)

我希望根据对象实例外部的信息有条件地创建对象实例的副本。副本中的大部分信息与原件相同,但部分信息需要更改。这些信息在参与者之间传递,因此我需要对象是不可变的,以避免奇怪的并发相关行为。下面的玩具代码是一个简单的例子,我想得到一些帮助

如果我有以下代码:

case class Container(condition:String,amount:Int,ID:Long)
我可以做到以下几点:

    val a = new Container("Hello",10,1234567890)
    println("a = " + a)
    val b = a.copy(amount = -5)
    println("b = " + b)
    println("amount in b is " + b.amount)
import scala.Math._
val max = 3     
val c = if(abs(b.amount) >= max) b.copy(amount = max,condition="Goodbye") else if(abs(b.amount) < max) b.copy(amount = abs(b.amount))
println("c = " + c)
输出是

a = Container(Hello,10,1234567890)
b = Container(Hello,-5,1234567890)
amount in b is -5
c = Container(Goodbye,3,1234567890)
c = Container(Hello,2,1234567890)
我还可以有条件地创建对象的副本,方法如下:

    val a = new Container("Hello",10,1234567890)
    println("a = " + a)
    val b = a.copy(amount = -5)
    println("b = " + b)
    println("amount in b is " + b.amount)
import scala.Math._
val max = 3     
val c = if(abs(b.amount) >= max) b.copy(amount = max,condition="Goodbye") else if(abs(b.amount) < max) b.copy(amount = abs(b.amount))
println("c = " + c)
如果我将b对象中的数量设置为-2,那么输出是

a = Container(Hello,10,1234567890)
b = Container(Hello,-5,1234567890)
amount in b is -5
c = Container(Goodbye,3,1234567890)
c = Container(Hello,2,1234567890)
然而,当我试图打印出c.amount时,编译器会用以下消息标记它

println("amount in c is " + c.amount)
value amount不是任何

如果我将c对象创建行更改为

val c:Container = if(abs(b.amount) >= max) b.copy(amount = max,condition="Goodbye") else if(abs(b.amount) < max) b.copy(amount = abs(b.amount))
val c:Container=if(abs(b.amount)>=max)b.copy(amount=max,condition=“再见”)否则if(abs(b.amount)
我得到了编译器错误

类型失配;发现:所需单元: 容器

通过复制现有实例并修改一两个值,有条件地创建case类的不可变实例的最佳惯用方法是什么

谢谢,
Bruce

您没有包含最后的
else
子句。因此,
c
的类型是
Any
——这是
容器
单元
的唯一超类型,其中
单元
是由于没有包含一个catch-all
else
子句而导致的。如果您试图通过写入
c:Container=
来强制结果类型为
Container
,编译器现在会告诉您导致
单元的
缺失的
else
子句不可分配给
Container

因此