я создать ObservableMap, и абонент, который просто печатает любые события, которые он получает (из here):подписчиков событий не вызываются при обновлении() вызываются на ObservableMap
class MyMap extends HashMap[Int,Int] with ObservableMap[Int,Int]
class MySub extends Subscriber[Message[(Int,Int)] with Undoable, ObservableMap[Int, Int]] {
def notify(pub: ObservableMap[Int, Int], evt: Message[(Int, Int)] with Undoable) {
println(evt)
}
}
val map = new MyMap
map.subscribe(new MySub)
Использование + = , ++ = и - = работа, как и ожидалось:
scala> map += 1 -> 1
Include(NoLo,(1,1))
res5: map.type = Map(1 -> 1)
scala> map ++= Map(2 -> 4, 3 -> 9)
Include(NoLo,(3,9))
Include(NoLo,(2,4))
res6: map.type = Map(3 -> 9, 1 -> 1, 2 -> 4)
scala> map -= 1
Remove(NoLo,(1,1))
res7: map.type = Map(3 -> 9, 2 -> 4)
Но обновление не работает:
scala> map(4) = 16
scala> map
res9: MyMap = Map(3 -> 9, 4 -> 16, 2 -> 4)
Почему? Похоже, ObservableMap переопределяет + =, - = и clear. Оба ++ = и обновление, по-видимому, реализовано в терминах + = (по мнению Growable и MapLike), так почему это работает на одном, но не на другом?
Спасибо! Я отсутствовал, хотя MapLike определяет его с помощью + =, HashMap переопределяет его с помощью put(). Если я добавлю это в мое объявление, он будет работать как ожидается: переопределить def update (k: Int, v: Int) {this + = k -> v} – srparish
Я был укушен изменчивыми коллекциями, прежде чем я обычно остаюсь в стороне (см. scalaz). Вы могли бы подумать, что у них будут очень похожие реализации, но это не так. – Noah