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)
这是这种行为吗?
+=方法a?(包括有这种行为的其他例子吗?)相关的例子
改编自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_=方法).
或者正如规范所说:
如果满足以下两个条件,则重新解释.
- 左侧
l没有名为的成员+=,也无法通过隐式转换转换为名为成员的值+=.- 赋值
l = l + r是类型正确的.特别地,这意味着l引用可以分配给的变量或对象,并且可以转换为具有名为的成员的值+.
这是这种行为吗?
- 完全取决于是否有合适的+ =方法?
- 独立于对象是val还是var?
不完全的.如果有合适的+=方法,则无论其他因素如何(例如a可分配),都会调用它.但是当没有时,其他因素决定它是否已经消失或者您收到错误消息.
请注意,您获得的错误消息与您从desugared版本获得的错误消息不同:当desugaring的标准不适用时,您会收到一条错误消息,告诉您"+ =不是...的成员.",加上解释为什么不能应用desugaring(例如"接收器不可分配"或者a + b如果a + b产生类型错误你会得到的类型错误).