2012-06-30 73 views
3

我有這樣的功能:在Scala中定義一個函數參數爲「var」?

private def add[T](n: String, t: T, k: Map[String,T]): T = { k += (n -> t); t } 

編譯器會抱怨,有一個重新分配到VAL,所以達不到這個改變了一個可變的地圖的,有沒有辦法說類似「變種K:地圖......「如同一個案例課程一樣?

謝謝!

回答

6

你要求的是一個pass by reference參數。在JVM沒有這些也不認爲斯卡拉*

你將不得不返回更新地圖:

private def add[T](n: String, t: T, k: Map[String,T]): Map[String,T] = k + (n -> t) 

或同時返回,或者如果你必須返回T,寫一個包裝類:

case class Vary[A](var value: A) { def apply() = value } 
private def add[T](n: String, t: T, k: Vary[Map[String,T]]) = { k.value += (n -> t); t } 

val map = Vary(Map.empty[String,Int]) 
add("fish", 5, map) 
map() //Map[String,Int] = Map(fish -> 5) 

*嗯,不是直接。當然,我們必須通過閉包來改變外部環境中的變量,事實上Scala所做的就是使用一個類似於上面展示的包裝類。

+0

好的,謝謝!...... – Alex

+4

它不需要通過引用。它可以是'var',而不需要在被調用者上重新分配可見值。我會告訴你,看起來他希望通過引用傳遞,否則代碼將毫無意義。我能說什麼?我很挑剔。 :-) –

+1

@ DanielC.Sobral - 我的後編譯程序的優化步驟將該分支作爲死代碼消除,因此我沒有提及它。 :) –

相關問題