什么时候+ = b在Scala中成为a = a + b?

Joe*_*ley 12 scala syntactic-sugar assignment-operator

斯卡拉有时候只是脱毒

a += b
Run Code Online (Sandbox Code Playgroud)

a = a + b
Run Code Online (Sandbox Code Playgroud)

但不总是.例如,一些可变集合定义了一个+=方法,而不是它变成了一个方法

a.+=(b)
Run Code Online (Sandbox Code Playgroud)

这是这种行为吗?

  1. 完全取决于是否有合适的+=方法a?(包括有这种行为的其他例子吗?)
  2. 独立于对象是val还是var?

相关的例子

改编自Scala中的编程

var s = Set("a", "b")
s += "c"
Run Code Online (Sandbox Code Playgroud)

在这种情况下,第二行代码s += "c"基本上是简写:

s = s + "c"
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 10

什么时候+ = b在Scala中成为a = a + b?

当没有适用+=的方法,有可应用的+方法和a可分配(即,它是一个var或有一个a_=方法).

或者正如规范所说:

如果满足以下两个条件,则重新解释.

  1. 左侧l没有名为的成员+=,也无法通过隐式转换转换为名为成员的值+=.
  2. 赋值l = l + r是类型正确的.特别地,这意味着l引用可以分配给的变量或对象,并且可以转换为具有名为的成员的值+.

这是这种行为吗?

  1. 完全取决于是否有合适的+ =方法?
  2. 独立于对象是val还是var?

不完全的.如果有合适的+=方法,则无论其他因素如何(例如a可分配),都会调用它.但是当没有时,其他因素决定它是否已经消失或者您收到错误消息.

请注意,您获得的错误消息与您从desugared版本获得的错误消息不同:当desugaring的标准不适用时,您会收到一条错误消息,告诉您"+ =不是...的成员.",加上解释为什么不能应用desugaring(例如"接收器不可分配"或者a + b如果a + b产生类型错误你会得到的类型错误).