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

Scala Деконструкция кортежа

Я новичок в Scala, и пробежал по маленькой икоте, которая меня раздражала.

Инициализация двух параллельных варов отлично работает: var (x,y) = (1,2)

Однако я не могу найти способ параллельного назначения новых значений: (x,y) = (x+y,y-x) //invalid syntax

В итоге я пишу что-то вроде этого: val xtmp = x+y; y = x-y; x = xtmp

Я понимаю, что писать функциональный код - это один из способов избежать этого, но есть определенные ситуации, когда у вас просто смысл.

У меня есть два вопроса:

1) Есть ли лучший способ сделать это? Я что-то пропустил?

2) В чем причина не допущения правильного параллельного назначения?

4b9b3361

Ответ 1

К сожалению, вы не можете выполнять несколько назначений в Scala. Но вы можете использовать кортежи, если они соответствуют вашей проблеме:

scala> var xy = (1,2)
xy: (Int, Int) = (1,2)

scala> xy = (xy._1 + xy._2, xy._2 - xy._1)
xy: (Int, Int) = (3,1)

Таким образом, xy - это один кортеж с двумя значениями. Первое значение можно получить с помощью xy._1, второй - с помощью xy._2.

Ответ 2

Scala имеет 2 типа переменных: vals и vars. Vals похожи на конечные переменные Java, поэтому, насколько я понимаю из того, что вы просите, единственный способ назначить новые значения параллельно vals:

scala> val (x, y) = (1, 2);

или

scala> val s = (3, 4);
s: (Int, Int) = (3,4)

scala> s._1
res1: Int = 3

scala> s._2
res2: Int = 4