我如何在Scala中表达链式作业?

som*_*guy 8 expression scala variable-assignment

我如何在scala中表达以下java代码?

a = b = c;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我正在重新分配变量(不是声明).

ret*_*nym 13

Scala中最接近的快捷语法只能在声明var或使用时使用val.

scala> val c = 1  
c: Int = 1

scala> val a, b = c
a: Int = 1
b: Int = 1
Run Code Online (Sandbox Code Playgroud)

来自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 = e.值定义val p 1,...,p n:T = e是值定义序列的缩写val p 1 :T = e; ...; val p n:T = e.

这不适用于重新分配给a var.由于这里解释的原因,C/Java风格不起作用:Scala分配评估单元的动机是什么

  • 请注意,右侧的表达式将被评估几次(每个变量一次):例如`a a中的`a`和`b`,b = new Object`将引用不同的对象. (2认同)

Eug*_*bun 5

使用赋值的左侧在语法上是模式的事实.(参见SLS中的 PatVarDef> PatDef> Pattern2 .)

a = b = 5

scala> val a@b = 5
a: Int = 5
b: Int = 5
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

请注意,右侧站点上的表达式仅计算一次.

不幸的是,这种语法不适用于重新分配(所以x = y = value你仍然需要这样做x = value; y = x).

另请参见[scala-language] Scala中的链接赋值