Я могу сделать что-то как
def f(): Tuple2[String, Long] = ...
val (a, b) = f()
Что относительно того, если переменные являются уже существующими? Я выполняю те же наборы данных по фильтрам, и я не хочу объединять их в цепочку (длинные имена и такой). Это - то, что я попробовал, но это жалуется на ожидание; вместо = на последней строке:
var a = ...initialization for this data
var b = ...some other init
(a, b) = g(a, b) // error: expected ';' but found '='
Существует ли способ избежать посреднического кортежа?
Он работает для новых значений, потому что этот синтаксис обрабатывается как сопоставление с образцом, как и операторы case. Итак, как сказал Алекс , вы не можете этого сделать.
Если вы всегда запускаете «одни и те же наборы данных» над фильтрами и т. Д., Это признак того, что они каким-то образом связаны друг с другом, поэтому вам следует подумать о том, чтобы сгруппировать их, используя либо кортеж, либо выделенный класс (обычно класс case в таких случаи).
Как заметил Алекс, краткий ответ - нет. Что происходит с вашим кодом: когда a и b уже являются связанными переменными в текущей области видимости, (a, b) означает «принять значения из a и b и построить из них кортеж ».
Следовательно,
(a, b) = ...
эквивалентно
(new Tuple2(a, b)) = ...
, что, очевидно, не то, что вы хотите (кроме бессмысленности).
Желаемый синтаксис (возможность назначать сразу нескольким переменным) просто не существует. Вы даже не можете присвоить одно и то же значение сразу нескольким уже существующим переменным (обычный синтаксис «a = b = ...», который встречается во многих других языках, не работает в Scala.) Я не не думаю, что это случайность, что вальс пользуется преимуществом перед варами; они почти всегда лучше.
Похоже, все это происходит внутри какого-то цикла и выполняет повторяющиеся задания. Это не совсем идиоматическая Scala. Я бы порекомендовал вам попытаться исключить использование vars в вашей программе и сделать что-то более функциональным, используя такие как map, flatMap, filter, foldLeft и т. Д.