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, один с одной строкой, а другой с двумя.