2010-07-28 100 views
2

请看下面的代码:“+ =”会重新分配还是不分配?

val names = Set("Mike", "Jack") 
names += "Jeff" 

将会有一个错误:

error: reassignment to val 

我在一些书看,它说+=实际上是一种方法,该代码可以是:

val names = Set("Mike", "Jack") 
names.+=("Jeff") 

如果+=是一种方法,为什么会分配“名称”?

回答

10

scala.collection.mutable.Set has + = method。所以不管是val还是var,你只是在底层集合上调用一个方法。但scala.collection.immutable.Set没有+ =方法,但有+方法。 + =在Scala中有特殊含义;它可以像这样应用,names = names +“Jeff”,因为这是重新分配给val'名称',编译器报告错误。

实施例(+被施加并重新分配在适当的位置做+ =的)

class Test(num: Int) { 
def +(n: Int) = new Test(num + n); 
override def toString = num.toString 
} 

defined class Test 

val foo = new Test(5) 

foo: Test = 5 

foo += 4 

error: reassignment to val 
     foo += 4 
     ^

var bar = new Test(5) 

bar: Test = 5 

bar += 4 

bar 

res12: Test = 9 
+0

非常感谢你! – Freewind 2010-07-28 07:31:35

+0

@Freewind,欢迎光临! – 2010-07-28 09:25:01

2

短答案:

scala> val names = collection.mutable.Set("Mike", "Jack") 
names: scala.collection.mutable.Set[java.lang.String] = Set(Jack, Mike) 

scala> names += "Jeff" 
res23: names.type = Set(Jack, Jeff, Mike) 

或可以导入可变设置是这样的:

import scala.collection.mutable.Set