我将如何在 Scala 中表达链式赋值?
Posted
技术标签:
【中文标题】我将如何在 Scala 中表达链式赋值?【英文标题】:How would I express a chained assignment in Scala? 【发布时间】:2011-01-27 09:23:50 【问题描述】:如何在 scala 中表达以下 java 代码?
a = b = c;
顺便说一句,我正在重新分配变量(不是声明)。
【问题讨论】:
【参考方案1】:只有在声明 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
将引用不同的对象。【参考方案2】:
利用赋值的左侧在语法上是一个模式这一事实。 (请参阅 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
)。
另见[scala-language] Chained assignment in Scala
【讨论】:
【参考方案3】:表达式(赋值)b = c
的“返回类型”恐怕是Unit
,这意味着这个语法无效。
【讨论】:
【参考方案4】:b = c; a = b
尴尬,我知道。这就是 Scala 几乎告诉你“不要那样做”。将其视为用于块分隔的 Python 空间标识的 Scala 版本。
【讨论】:
【参考方案5】:val b = c
val a = b
你不会写
val a = b = c
因为它定义了一个表达式
【讨论】:
或var
,当变量是可变的而不是最终的。
没有速记吗?写 b = c; 似乎很愚蠢a = b以上是关于我将如何在 Scala 中表达链式赋值?的主要内容,如果未能解决你的问题,请参考以下文章