Подтвердить что ты не робот

В Scala, как я могу переназначить значения кортежа?

Я пытаюсь сделать что-то вроде следующего

var tuple = (1, "test")
tuple._2 = "new"

Однако это не скомпилирует жалобу на val

4b9b3361

Ответ 1

Вы не можете переназначить значения кортежа. Они намеренно неизменны: как только вы создали кортеж, вы можете быть уверены, что он никогда не изменится. Это очень полезно для написания правильного кода!

Но что, если вы хотите другой кортеж? То, где приходит метод копирования:

val tuple = (1, "test")
val another = tuple.copy(_2 = "new")

или если вы действительно хотите использовать var для хранения кортежа:

var tuple = (1, "test")
tuple = tuple.copy(_2 = "new")

В качестве альтернативы, если вы действительно хотите, чтобы ваши значения изменялись индивидуально, вы можете использовать класс case вместо этого (возможно, с неявным преобразованием, чтобы вы могли получить кортеж, когда вам это нужно):

case class Doublet[A,B](var _1: A, var _2: B) {}
implicit def doublet_to_tuple[A,B](db: Doublet[A,B]) = (db._1, db._2)
val doublet = Doublet(1, "test")
doublet._2 = "new"

Ответ 2

Вы можете обернуть компоненты (компоненты), которые необходимо изменить в классе case с членом var, например:

case class Ref[A](var value: A)

var tuple = (Ref(1), "test")
tuple._1.value = 2
println(tuple._1.value) // -> 2