如何在设置属性值之前和之后存储对象状态
how to store object state before and after setting attribute values
我有一个class演示我想在设置属性值之前保存对象值这是我的代码
case class Demo (var abc:String)
val d =Demo("bob")
var oldDemo=d
d.abc="joe"
println("old name is "+oldDemo.abc +" the new name is "+d.abc)
控制台上打印的输出是
old name is joe the new name is joe
我想在设置 d.abc="joe"
之前存储对象值,这样当我设置 oldDemo.abc
时我可以得到 bob
请指导我哪里出错了,什么是实现我目标的正确方法。如果我做了一些愚蠢的事情,我深表歉意
您可以在案例 class 上使用 copy()
。
val d1 = Demo("abc")
val d2 = d1.copy()
d1.abc = "def"
// d2 : Demo = Demo(abc)
// d1 : Demo = Demo(def)
一种更符合 Scala 习惯的方法是使用不可变大小写 classes:
case class Person(name: String, age: Int)
val bob = Person("Bob", 30)
val joe = bob.copy(name="Joe")
// bob : Person = Person(Bob,30)
// joe : Person = Person(Joe,30)
实现此目的的最佳方法是不使用可变变量。喜欢
case class Demo(abc: String)
val d = Demo("bob")
val newDemo = d.copy(abc = "joe")
println("old name is " + d.abc + " the new name is " + newDemo.abc)
- afaik,case classes 是不可变的。
- case class 很便宜,所以不可变的 case class 可能会满足您的要求。
- 如果您更改可变对象,对该对象的引用将无法帮助您存储以前的状态。为此,您需要该对象的副本。
因此,根据您的要求,我会复制原始对象更改 select 属性以对其进行 qasi 变异
case class Demo(abc: String)
val demo = Demo("foo")
val quasiMutatedDemo = demo.copy(abc = "bar")
否则我将不得不在我的可变 class 中实现一个副本(只是因为我永远无法让自己创建一个可变案例 class)。
class Demo(var abc: String) {
def copy: Demo = new Demo(this.abc)
}
val demo = new Demo("foo")
val odlDemo = demo.copy
val mutatedDemo = demo.abc = "bar"
我有一个class演示我想在设置属性值之前保存对象值这是我的代码
case class Demo (var abc:String)
val d =Demo("bob")
var oldDemo=d
d.abc="joe"
println("old name is "+oldDemo.abc +" the new name is "+d.abc)
控制台上打印的输出是
old name is joe the new name is joe
我想在设置 d.abc="joe"
之前存储对象值,这样当我设置 oldDemo.abc
时我可以得到 bob
请指导我哪里出错了,什么是实现我目标的正确方法。如果我做了一些愚蠢的事情,我深表歉意
您可以在案例 class 上使用 copy()
。
val d1 = Demo("abc")
val d2 = d1.copy()
d1.abc = "def"
// d2 : Demo = Demo(abc)
// d1 : Demo = Demo(def)
一种更符合 Scala 习惯的方法是使用不可变大小写 classes:
case class Person(name: String, age: Int)
val bob = Person("Bob", 30)
val joe = bob.copy(name="Joe")
// bob : Person = Person(Bob,30)
// joe : Person = Person(Joe,30)
实现此目的的最佳方法是不使用可变变量。喜欢
case class Demo(abc: String)
val d = Demo("bob")
val newDemo = d.copy(abc = "joe")
println("old name is " + d.abc + " the new name is " + newDemo.abc)
- afaik,case classes 是不可变的。
- case class 很便宜,所以不可变的 case class 可能会满足您的要求。
- 如果您更改可变对象,对该对象的引用将无法帮助您存储以前的状态。为此,您需要该对象的副本。
因此,根据您的要求,我会复制原始对象更改 select 属性以对其进行 qasi 变异
case class Demo(abc: String)
val demo = Demo("foo")
val quasiMutatedDemo = demo.copy(abc = "bar")
否则我将不得不在我的可变 class 中实现一个副本(只是因为我永远无法让自己创建一个可变案例 class)。
class Demo(var abc: String) {
def copy: Demo = new Demo(this.abc)
}
val demo = new Demo("foo")
val odlDemo = demo.copy
val mutatedDemo = demo.abc = "bar"