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

时间:2018-08-21 15:28:24

标签: scala assignment-operator syntactic-sugar

仅标量有时矮胖

a += b

a = a + b

但并非总是如此。例如,某些可变集合定义了+=方法,而该方法变成了

a.+=(b)

这是行为

    是否完全由+=上的a方法确定? (包括此行为的其他示例吗?)
  1. 与对象是val还是var无关?

相关示例

改编自中的 Scala编程

var s = Set("a", "b")
s += "c"
  

在这种情况下,代码s += "c"的第二行实际上是以下代码的简写:

s = s + "c"

2 个答案:

答案 0 :(得分:10)

  

在Scala中,何时+ = b变成a = a + b?

如果没有适用的+=方法,则有 适用的+方法,并且a是可分配的(也就是说,它是{{1} }或使用var方法。

或者如the spec所述:

  

如果满足以下两个条件,则会发生重新解释。

     
      
  1. 左侧a_=没有名为l的成员,也不能通过隐式转换转换为名为+=的成员的值。
  2.   
  3. 分配+=是类型正确的。特别是,这意味着l = l + r指的是可以分配给它的变量或对象,并且可以转换为具有名为l的成员的值。
  4.   

  

这是行为

     
      
  1. 完全由a上是否有合适的+ =方法确定?
  2.   
  3. 与对象是val还是var无关?
  4.   

不完全是。如果有合适的+方法,则无论任何其他因素(例如,+=是可分配的)都将被调用。但是,如果没有,其他因素将决定它是否已废弃或收到错误消息。

请注意,您收到的错误消息与从经过废止的版本得到的错误消息不同:如果不存在废止要求的条件,则会收到一条错误消息,告诉您“ + =不是成员...”,并解释了为什么无法应用重复使用(例如“接收者不可分配”或如果a会产生{错误)。

答案 1 :(得分:0)

在我的第一个回答中,我有点草率,我很抱歉。经过一番研究并更好地阅读了@ sepp2k的答案和评论,我得出的结论是,Scala中的某些类实现了+=方法,而另一些类仅实现了+方法,我在使用一些Scala代码,例如:

  //Set, Int, Double, String implements the "+" method,
  //and then "+=" is syntactic sugar of a = a + b 
  var set = Set("a", "b")
  set += "c"

  var num = 3
  num += 2

  var str = "43"
  str += 5

  var l = List()
  l += "someString"

  // As you mention, MutableList implements "+=" method, and when you do
  // mutL += 4, is the same as call the method mutL.+=
  var mutL = new mutable.MutableList[Int]
  mutL += 4