Как в Scala переназначить значения кортежей? - PullRequest
12 голосов
/ 22 августа 2011

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

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

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

Ответы [ 2 ]

40 голосов
/ 22 августа 2011

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

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

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

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

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"
0 голосов
/ 07 октября 2017

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

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

var tuple = (Ref(1), "test")
tuple._1.value = 2
println(tuple._1.value) // -> 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...