How would I express a chained assignment in Scala?

后端 未结 5 1486
南方客
南方客 2021-01-05 01:05

How would I express the following java code in scala?

a = b = c;

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

相关标签:
5条回答
  • 2021-01-05 01: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

    0 讨论(0)
  • 2021-01-05 01:25

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

    0 讨论(0)
  • 2021-01-05 01:31
    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.

    0 讨论(0)
  • 2021-01-05 01:33

    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

    0 讨论(0)
  • 2021-01-05 01:39
    val b = c
    val a = b
    

    You can't write

    val a = b = c
    

    since that defines an expression

    0 讨论(0)
提交回复
热议问题