Permettez-moi de résumer votre problème:
- Vous voulez appeler une méthode sur une structure de données immuables
- Vous voulez revenir une valeur et réattribuer un
var
- Parce que la structure de données est immuable, vous devez
- retourner une nouvelle structure de données immuable, ou
- faire l'affectation dans la méthode, en utilisant une fermeture fournie
Alors, que ce soit votre signature doit ressembler à
def getOrElseUpdate(key: K): Tuple2[V, Map[K,V]]
//... use it like
val (v, m2) = getOrElseUpdate(k)
map = m2
ou
def getOrElseUpdate(key: K, setter: (Map[K,V]) => Unit): V
//... use it like
val v = getOrElseUpdate(k, map = _)
Si vous pouvez vivre avec Une de ces solutions, vous pouvez ajouter votre propre version avec une conversion implicite, mais à en juger par les signatures seules, je ne pense pas que l'une de ces solutions soit dans la bibliothèque standard.
'map + = clé -> valeur' -> Peut-être que vous voulez dire carte mutable.Map? –
Je pense que vous voulez dire mutable.Map !? Vous utilisez + = dans votre code qui ne fonctionne pas pour immutable.Map. Pour mutable.Map, il y a getOrElseUpdate(). – michid
@Vasil Remeniuk, @michid: Bien sûr, cela fonctionne. Lorsqu'il n'y a pas de méthode '+ =', le compilateur convertit l'expression en 'map = map + key -> value'. J'ai mis à jour la question pour clarifier la carte est un var – IttayD