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) В чем причина не допущения правильного параллельного назначения?
Ответы
Ответ 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