3
我有這樣的功能:在Scala中定義一個函數參數爲「var」?
private def add[T](n: String, t: T, k: Map[String,T]): T = { k += (n -> t); t }
編譯器會抱怨,有一個重新分配到VAL,所以達不到這個改變了一個可變的地圖的,有沒有辦法說類似「變種K:地圖......「如同一個案例課程一樣?
謝謝!
我有這樣的功能:在Scala中定義一個函數參數爲「var」?
private def add[T](n: String, t: T, k: Map[String,T]): T = { k += (n -> t); t }
編譯器會抱怨,有一個重新分配到VAL,所以達不到這個改變了一個可變的地圖的,有沒有辦法說類似「變種K:地圖......「如同一個案例課程一樣?
謝謝!
你要求的是一個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所做的就是使用一個類似於上面展示的包裝類。
好的,謝謝!...... – Alex
它不需要通過引用。它可以是'var',而不需要在被調用者上重新分配可見值。我會告訴你,看起來他希望通過引用傳遞,否則代碼將毫無意義。我能說什麼?我很挑剔。 :-) –
@ DanielC.Sobral - 我的後編譯程序的優化步驟將該分支作爲死代碼消除,因此我沒有提及它。 :) –