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-allelse
子句而导致的。如果您试图通过写入c:Container=
来强制结果类型为Container
,编译器现在会告诉您导致单元的缺失的else
子句不可分配给Container
因此