【发布时间】:2011-01-27 09:23:50
【问题描述】:
如何在 scala 中表达以下 java 代码?
a = b = c;
顺便说一句,我正在重新分配变量(不是声明)。
【问题讨论】:
标签: scala expression variable-assignment
如何在 scala 中表达以下 java 代码?
a = b = c;
顺便说一句,我正在重新分配变量(不是声明)。
【问题讨论】:
标签: scala expression variable-assignment
只有在声明 var 或 val 时才能使用 Scala 中最接近的快捷语法。
scala> val c = 1
c: Int = 1
scala> val a, b = c
a: Int = 1
b: Int = 1
来自 Scala 参考,第 4.1 节
值声明 val x1 , ... , xn:T 是序列的简写 价值声明 val x1: T ; ...; val xn: T. 值定义 val p1, ..., pn = e 是一个 值序列的简写 定义 val p1 = e ; ...; val pn = e 。值定义 val p1, ... , pn : T = e 是 值定义序列 val p1 : T = e ; ...; val pn: T = e .
这不适用于重新分配给var。由于此处解释的原因,C/Java 样式不起作用:What is the Motivation for Scala Assignment Evaluating to Unit
【讨论】:
val a, b = new Object 中的 a 和 b 将引用不同的对象。
利用赋值的左侧在语法上是一个模式这一事实。 (请参阅 SLS 中的 PatVarDef > PatDef > Pattern2。)
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)。
【讨论】:
表达式(赋值)b = c 的“返回类型”恐怕是Unit,这意味着这个语法无效。
【讨论】:
b = c; a = b
尴尬,我知道。这就是 Scala 几乎告诉你“不要那样做”。将其视为用于块分隔的 Python 空间标识的 Scala 版本。
【讨论】:
val b = c
val a = b
你不会写
val a = b = c
因为它定义了一个表达式
【讨论】:
var,当变量是可变的而不是最终的。