我将如何在 Scala 中表达链式赋值?

Posted

技术标签:

【中文标题】我将如何在 Scala 中表达链式赋值?【英文标题】:How would I express a chained assignment in Scala? 【发布时间】:2011-01-27 09:23:50 【问题描述】:

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

a = b = c;

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

【问题讨论】:

【参考方案1】:

只有在声明 varval 时才能使用 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 中的 ab 将引用不同的对象。【参考方案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 中表达链式赋值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GraphQL 中表达输入验证

如何在 Django 中表达一对多关系?

如何在 Eclipse PDE 中表达项目间依赖关系

如何在 Scala 中表示一个空字符?

如何在 EF Core 和 LINQ 中表达 GetDate() 和 DateAdd() 方法?

如何在 Django 1.9 中表达 sqlite LEFT OUTER JOIN?