Scala案例类更新值

bas*_*han 23 scala option case-class

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

我该怎么做?

Jes*_*per 53

定义案例类,以便第二个成员是var:

case class Stuff(name: String, var value: Option[String])
Run Code Online (Sandbox Code Playgroud)

现在您可以创建一个实例Stuff并修改第二个值:

val s = Stuff("bashan", None)

s.value = Some("hello")
Run Code Online (Sandbox Code Playgroud)

但是,使案例类可变可能不是一个好主意.您应该更喜欢使用不可变数据结构.而不是创建可变的案例类,使其不可变,并使用该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"))
Run Code Online (Sandbox Code Playgroud)

  • 我发现在处理不可变的case类时非常有用的是为大多数通常修改的值引入一系列`withXYZ`方法.即添加`def withValue(v:String):Stuff = copy(value = Some(v))`to`Stuff`类定义将允许您以下列方式创建修改后的副本`s1.withValue("hello") ` (15认同)
  • @OfLettersAndNumbers因为使对象不可变有许多优点(这意味着:它们在创建后不能更改)。它使代码更简单并防止并发问题(当多个线程正在访问一个对象时;如果线程在修改对象而其他线程同时在使用这些对象,则可能导致困难的问题)。它不是特定于Scala的,但不变性是函数式编程的原理之一。 (2认同)
  • @Jesper 感谢您的澄清。这很有意义。您如何知道何时使用不可变对象和可变对象?或者您可以在设计时只考虑前者而不必使用可变对象吗? (2认同)
  • @OfLettersAndNumbers特别是如果您以函数式风格进行编程,则其想法是使事物尽可能不变,但有时出于实际原因,您可能希望使某些事物可变。在网络上,您可以找到很多关于不变和可变的信息。Scala案例类主要是不可变的。 (2认同)