Как бы я выразил связанное назначение в Scala? - PullRequest
8 голосов
/ 14 марта 2010

Как бы я выразил следующий код Java в Scala?

a = b = c;

Кстати, я переназначаю переменные (не объявляю).

Ответы [ 5 ]

13 голосов
/ 14 марта 2010

Ближайший синтаксис ярлыка в Scala может использоваться только при объявлении var или val.

scala> val c = 1  
c: Int = 1

scala> val a, b = c
a: Int = 1
b: Int = 1

Из справочника Scala, раздел 4.1

Объявление значения val x 1 , ..., x n : T - сокращение для последовательности объявлений значений val x 1 : T; ...; val x n : T. Определение значения val p 1 , ..., p n = e является сокращение для последовательности значений определения val p 1 = e; ...; val p n = е. Определение значения val p 1 , ..., p n : T = e является сокращением для последовательность определений значений val p 1 : T = e; ...; val p n : T = e.

Это не работает для переназначения var. Стиль C / Java не работает по причинам, объясненным здесь: Что является мотивацией для присвоения Scala оценки единице

5 голосов
/ 13 февраля 2012

Используя тот факт, что левая часть присваивания является синтаксически шаблоном.(См. PatVarDef> PatDef> Pattern2 в SLS .)

a = b = 5

scala> val a@b = 5
a: Int = 5
b: Int = 5

x = y = z = новый объект

scala> var x@(y@z) = new Object
x: java.lang.Object = java.lang.Object@205144
y: java.lang.Object = java.lang.Object@205144
z: java.lang.Object = java.lang.Object@205144

Обратите внимание, что выражение на правом сайте оценивается только один раз.

К сожалению, этот синтаксис не работает для re присваивания (то есть для x = y = value выеще нужно сделать x = value; y = x).

См. также [scala-language] Цепное задание в Scala

1 голос
/ 14 марта 2010
b = c; a = b

Неловко, я знаю. Это Скала в значительной степени говорит вам "не делай этого". Считайте, что это Scala-версия пространственной идентификации Python для разделения блоков.

1 голос
/ 14 марта 2010

Боюсь, что "тип возврата" выражения (присваивания) b = c равен Unit, что означает, что этот синтаксис недопустим.

0 голосов
/ 14 марта 2010
val b = c
val a = b

Вы не можете написать

val a = b = c

, поскольку это определяет выражение

...