withDefaultValue
использует одно и то же значение каждый раз.В вашем случае это один и тот же пустой ListBuffer
, который будет доступен всем.
Если вы используете вместо него withDefault
, вы можете каждый раз генерировать новый ListBuffer
, но он не будет сохранен.
Итак, вам действительно нужен метод, который знает, как добавить значение по умолчанию.Вы можете создать такой метод внутри класса-оболочки и затем написать неявное преобразование:
class InstantiateDefaults[A,B](h: collection.mutable.Map[A,B]) {
def retrieve(a: A) = h.getOrElseUpdate(a, h(a))
}
implicit def hash_can_instantiate[A,B](h: collection.mutable.Map[A,B]) = {
new InstantiateDefaults(h)
}
Теперь ваш код работает так, как вам нужно (за исключением дополнительного имени метода, которое вы можете выбрать более коротким, если хотите)):
val hash = new collection.mutable.HashMap[
String, collection.mutable.ListBuffer[Int]
].withDefault(_ => collection.mutable.ListBuffer())
scala> hash.retrieve("A").append(1)
scala> hash.retrieve("B").append(2)
scala> hash("B").head
res28: Int = 2
Обратите внимание, что решению (с неявным) вообще не нужно знать значение по умолчанию, так что вы можете сделать это один раз, а затем добавить по умолчанию с добавлением вашего сердца..