x = y =1 in Scala?

14

在阅读Scala for the Impatient这本书时,我遇到了这个问题:

想出一个情况,在Scala中赋值x = y = 1是有效的。(提示:为x选择合适的类型。)

我不确定作者具体指的是什么意思。赋值操作没有返回值,所以像var x = y = 1这样的语句应该返回Unit()作为x的值。有人能指出我可能漏掉了什么吗?

谢谢


我强烈怀疑作者并不认为 x 是 Unit 类型 - 通过“有效”,他们的意思是暗示“有一些目的”。 - Ed Staub
5个回答

13

事实上,在这种情况下,xUnit

var y = 2
var x = y = 1

可以理解为:

var y = 2
var x = (y = 1)

最后:

var x: Unit = ()

这个问题的整个意义是要展示 var x = y = 1 是有效的吗? - sc_ray

6
您可以按照以下方式达到在 REPL shell 中输入 x=y=1 时不会出现错误的点:

var x:Unit = {}
var y = 0
x = y = 1

2
这就是我所想的,除了我会写成 var x = () - cayhorstmann

3

这里还有一个不太常见的情况,即setter方法返回其参数。请注意x的类型实际上是Int

object AssignY {
  private var _y: Int = _
  def y = _y
  def y_=(i: Int) = { _y = i; i }
}

import AssignY._

var x = y = 1

(这个功能在XScalaWT库中使用,并在那个问题中讨论过。)


1
显然,这不是我想要的 :-) 但如果你想要奇怪的解决方案,那么 implicit def unit2int(u: Unit) = 42; var x = 1; var y = 2; x = y = 1 怎么样? - cayhorstmann

1

顺便说一下,如果仍然需要将相同的值赋给两个变量,则可以使用以下方法:

scala> var x@y = 1
x: Int = 1
y: Int = 1

0

这是有效的,但不太合理,会造成混淆。

scala> var x=y=1
x: Unit = ()

scala> y
res60: Int = 1

scala> var x@y = 1
x: Int = 1
y: Int = 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接