Scala несколько присвоение на существующую переменную

Я могу сделать что-то как

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 '='

Существует ли способ избежать посреднического кортежа?

9
задан Quartz 27 July 2010 в 23:19
поделиться

4 ответа

​​

Он работает для новых значений, потому что этот синтаксис обрабатывается как сопоставление с образцом, как и операторы case. Итак, как сказал Алекс , вы не можете этого сделать.

1
ответ дан 4 December 2019 в 09:11
поделиться

Краткий ответ: Нет

8
ответ дан 4 December 2019 в 09:11
поделиться

Если вы всегда запускаете «одни и те же наборы данных» над фильтрами и т. Д., Это признак того, что они каким-то образом связаны друг с другом, поэтому вам следует подумать о том, чтобы сгруппировать их, используя либо кортеж, либо выделенный класс (обычно класс case в таких случаи).

0
ответ дан 4 December 2019 в 09:11
поделиться

Как заметил Алекс, краткий ответ - нет. Что происходит с вашим кодом: когда a и b уже являются связанными переменными в текущей области видимости, (a, b) означает «принять значения из a и b и построить из них кортеж ».

Следовательно,

(a, b) = ...

эквивалентно

(new Tuple2(a, b)) = ...

, что, очевидно, не то, что вы хотите (кроме бессмысленности).

Желаемый синтаксис (возможность назначать сразу нескольким переменным) просто не существует. Вы даже не можете присвоить одно и то же значение сразу нескольким уже существующим переменным (обычный синтаксис «a = b = ...», который встречается во многих других языках, не работает в Scala.) Я не не думаю, что это случайность, что вальс пользуется преимуществом перед варами; они почти всегда лучше.

Похоже, все это происходит внутри какого-то цикла и выполняет повторяющиеся задания. Это не совсем идиоматическая Scala. Я бы порекомендовал вам попытаться исключить использование vars в вашей программе и сделать что-то более функциональным, используя такие как map, flatMap, filter, foldLeft и т. Д.

14
ответ дан 4 December 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: