2010-07-28 144 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