Scala значение обновления класса case

У меня есть класс case с 2 членами String. Я хотел бы обновить второй элемент позже, поэтому сначала создаю экземпляр с String и None, а затем я загружу данные в класс и хотел бы обновить второй элемент с некоторым значением.

Как я могу это сделать?

Ответы

Ответ 1

Определите класс case, чтобы второй член был var:

case class Stuff(name: String, var value: Option[String])

Теперь вы можете создать экземпляр Stuff и изменить второе значение:

val s = Stuff("bashan", None)

s.value = Some("hello")

Однако использование классов классов mutable, вероятно, не является хорошей идеей. Вы должны предпочесть работать с неизменяемыми структурами данных. Вместо создания изменяемого класса case сделайте его неизменным и используйте метод 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"))

Ответ 2

Классы классов в Scala предпочтительно неизменяемы. Используйте обычный класс для того, чего вы пытаетесь достичь, или скопируйте объект класса case в новый с обновленным значением.

Ответ 3

Допустим, ваш класс кейс выглядит следующим образом:

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, и который добавляет еще одну строку, которая всегда установлена. Или, возможно, у вас должно быть два несвязанных класса case, один с одной строкой, а другой с двумя.