8

How would I express the following java code in scala?

a = b = c;

By the way, I'm re-assigning variables (not declaring).

someguy
  • 7,144
  • 12
  • 43
  • 57

5 Answers5

13

The closest shortcut syntax in Scala can only be used when you declare a var or val.

scala> val c = 1  
c: Int = 1

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

From the Scala Reference, Section 4.1

A value declaration val x1 , ... , xn: T is a shorthand for the sequence of value declarations val x1: T ; ...; val xn: T. A value definition val p1, ..., pn = e is a shorthand for the sequence of value definitions val p1 = e ; ...; val pn = e . A value definition val p1, ... , pn : T = e is a shorthand for the sequence of value definitions val p1 : T = e ; ...; val pn: T = e .

This doesn't work for re-assignement to a var. The C/Java style doesn't work for reasons explained here: What is the Motivation for Scala Assignment Evaluating to Unit

Community
  • 1
  • 1
retronym
  • 54,768
  • 12
  • 155
  • 168
  • 2
    Note that the expression on the right-hand-side will be evaluated several times (once per a variable): e.g. `a` and `b` in `val a, b = new Object` will refer to different objects. – Eugen Labun Mar 10 '12 at 16:58
5

Using the fact that the left-hand-side of an assignment is syntactically a pattern. (See PatVarDef > PatDef > Pattern2 in SLS.)

a = b = 5

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

x = y = z = new Object

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

Note that the expression on the right-hand-site is evaluated only once.

Unfortunately, this syntax doesn't work for reassigning (so for x = y = value you still have to do x = value; y = x).

See also [scala-language] Chained assignment in Scala

Eugen Labun
  • 2,561
  • 1
  • 22
  • 18
1

The "return type" of the expression (assignment) b = c is Unit, I'm afraid, which means this syntax is not valid.

oxbow_lakes
  • 133,303
  • 56
  • 317
  • 449
1
b = c; a = b

Awkward, I know. That's Scala pretty much telling you "don't do that". Consider it the Scala version of Python's space identation for block delimitation.

Daniel C. Sobral
  • 295,120
  • 86
  • 501
  • 681
-1
val b = c
val a = b

You can't write

val a = b = c

since that defines an expression

Brian Agnew
  • 268,207
  • 37
  • 334
  • 440