我有一个包含2个String成员的案例类。我想稍后更新第二个成员,所以首先我用String和None创建一个实例,然后我将数据加载到类中,并希望用某个值更新第二个成员。
我该怎么做?
答案 0 :(得分:48)
定义案例类,以便第二个成员是var
:
case class Stuff(name: String, var value: Option[String])
现在您可以创建Stuff
的实例并修改第二个值:
val s = Stuff("bashan", None)
s.value = Some("hello")
然而,使案例类可变可能不是一个好主意。您应该更喜欢使用不可变数据结构。而不是创建可变的案例类,使其成为不可变的,并使用copy
方法创建具有修改值的新实例。例如:
// Immutable Stuff
case class Stuff(name: String, value: Option[String])
val s1 = Stuff("bashan", None)
val s2 = s1.copy(value = Some("hello"))
// s2 is now: Stuff("bashan", Some("hello"))
答案 1 :(得分:2)
Scala中的案例类最好是不可变的。使用常规类来实现您要实现的目标,或者将您的案例类对象复制到具有更新值的新对象。
答案 2 :(得分:1)
假设您的案例类别如下:
case class Data(str1: String, str2: Option[String]
首先创建一个实例,将第二个字符串设置为None
:
val d1 = Data("hello", None)
现在,您可以通过将该对象复制到新对象中并用str2替换该值来创建新值:
val d2 = d1.copy(str2=Some("I finally have a value here"))
我还将考虑您的案例类不是数据的最佳表示形式的可能性。也许您需要一个扩展DataWithStr2
的类Data
,并添加另一个始终设置的字符串。也许您应该有两个不相关的案例类,一个带有一个字符串,另一个带有两个字符串。