2016-03-14 81 views
2

你好我是scala的新手,對於方法集合我很困惑。+(element)。 當我做這個關於scala中可變和不可變集合的困惑

var set_1: scala.collection.immutable.Set[Int] = scala.collection.immutable.Set[Int](2) 
set_1.+=(1) 
println(set_1) 

val set_1: scala.collection.mutable.Set[Int] = scala.collection.mutable.Set[Int](2) 
set_1.+=(1) 
println(set_1) 

我得到的結果Set(1, 2)對他們倆的。第一個我使用「var」和「immutable」,第二個我使用「val」和「mutable」。什麼是。+()方法的機制?它重新分配變量set_1或修改set_1的值? 任何人都可以幫助我嗎?

回答

3

在第一種情況下,您使用的是不可變集合,但是您將它存儲在var中。當調用「+ =」的結果類似,但以下,而不是創建一個新的變量設置2你是存儲在變量設置1組新...

val set1 = Set(2) 
val set2 = set1 + Set(1) 

原設定(2)從來都不是修改,而是創建一個新的集合。然後將該新集分配爲可變變量set1的值。

在第二種情況下,變量set1指向一個可變集合。你創建Set Set(1),然後修改相同的集合以包含Set(1,2)

這兩個用例都有,但個人而言,我會在大多數時間使用不可變集合,因爲它更容易關於的原因。

+0

這就是我的猜測。非常感謝你。 – Frankie

+0

對於「有效地做」,請參閱http://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#assignment-operators它很混亂,因爲第一個示例通常表示爲中綴,但是語法不會影響desugaring。 –

+0

感謝您的注意。我已經改寫了答案,以明確代碼只是一個類比,並且與desugaring完全不符 – justinhj

-3

在我看來,第一個例子不應該編譯。在這種情況下,=+是一個運算符,適用於var set_1,但set_1.+=語法使它看起來像是在實例set_1所指的實例上的常規方法調用。這是造成混亂的原因。

+0

您知道。+ =語法的用途是什麼(使用點)?是否有可能爲所有運營商做到這一點? – Tyler

+0

' .foo'通常只是在'''(在'immutable.Set'上,'+ ='只是一個常規的方法名稱')上的「調用方法'foo'。這正是我認爲第一個例子不應該編譯的原因。 – Dima

+0

@Dima但它可以編譯,你可以自己嘗試。所以我認爲。+ =在第一種情況下可以被視爲+ =。 – Frankie