2013-06-04 18 views
1

我想有一個結果序與三重(字符串,INT,INT)是這樣的:爲什麼:+追加到Seq沒有效果?

var all_info: Seq[(String, Int, Int)] = null 

現在,我嘗試將元素添加到我的序列如下:

if (all_info == null) { 
    all_info = Seq((name, id, count)) 
    } else { 
    all_info :+ (name, id, count) 
    } 

和打印出來

Console.println(all_info.mkString) 

不幸的是,打印結果僅僅是第一三倍由if子句添加和基本intializes一個新的序列,因爲它已經不僅僅是「空」 b安伏。 所有後面的三元組應該被添加到else子句中的Seq中。 我也嘗試過不同的方法,如「++」,它也不會工作(「太多的參數」)

無法真正弄清楚我在這裏做錯了什麼。

感謝您提前提供任何幫助! 問候。

回答

4

首先,而不是使用null s你會更好地使用一個空的集合。下一次使用:+ =所以結果:+ 不會被丟棄 - :+產生一個新的集合,而不是修改現有的集合。最終代碼看起來像

var all_info: Seq[(String, Int, Int)] = Seq.empty 
all_info :+= (name, id, count) 

正如你所看到的,現在你不需要if S和代碼應該很好地工作。

+0

奇怪的是,在庫中它是::+ =這個序列的一個副本附加了一個元素。所以我認爲它只是將新的三元組追加到現有的結果中,甚至沒有「:+ =」。無論如何,代碼工作正常,我瞭解到一個新的運營商,感謝您的幫助! :) – AvantiC

2

方法:+創建新集合並保留原始集合不變。

您應該使用方法+=。如果all_info中沒有方法+=,則編譯器會將all_info += (name, id, count)視爲all_info = all_info + (name, id, count)

相反,如果你會改變的all_info類型的一些可變集合,你會得到它的方法+=,所以按照預期的代碼將工作:對可變集合方法+=改變目標集合。

請注意,mutable collections中沒有方法:+=,所以即使對於可變集合,也會得到all_info = all_info :+ (name, id, count)

+0

我明白了,謝謝你的幫助! :) – AvantiC

相關問題