Scala案例类更新值

时间:2014-06-08 11:01:22

标签: scala option case-class

我有一个包含2个String成员的案例类。我想稍后更新第二个成员,所以首先我用String和None创建一个实例,然后我将数据加载到类中,并希望用某个值更新第二个成员。

我该怎么做?

3 个答案:

答案 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,并添加另一个始终设置的字符串。也许您应该有两个不相关的案例类,一个带有一个字符串,另一个带有两个字符串。