2012-06-30 3 views
3

У меня есть функция, как это:Определить параметр функции как «var» в Scala?

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

компилятор жалуется, что есть переназначение Вала, так коротки изменения этого к изменчивым карте, есть способ, чтобы сказать что-то вроде «вар к: Карта ... "как в случае класса?

Спасибо!

ответ

6

То, о чем вы просите, является аргументом pass by reference. JVM не те и ни делает Scala *

Вы должны либо вернуть обновленную карту:.

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 - Этап оптимизации моей почтовой компиляции рутинировал эту ветвь как мертвый код, и поэтому я не упоминал об этом. :) –

Смежные вопросы