2012-05-31 2 views
2

я создать 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), так почему это работает на одном, но не на другом?

ответ

3

Измененная версия HashMap вызывает обновление, которое в свою очередь вызывает put, который не вызывает + =, поэтому метод invable + = не вызывается. Я использую scala 2.9.1, но это должно быть одинаковым для 2.8.

От HashMap:

override def put(key: A, value: B): Option[B] = { 
    val e = findEntry(key) 
    if (e == null) { addEntry(new Entry(key, value)); None } 
    else { val v = e.value; e.value = value; Some(v) } 
    } 

    override def update(key: A, value: B): Unit = put(key, value) 

    def += (kv: (A, B)): this.type = { 
    val e = findEntry(kv._1) 
    if (e == null) addEntry(new Entry(kv._1, kv._2)) 
    else e.value = kv._2 
    this 
    } 
+1

Спасибо! Я отсутствовал, хотя MapLike определяет его с помощью + =, HashMap переопределяет его с помощью put(). Если я добавлю это в мое объявление, он будет работать как ожидается: переопределить def update (k: Int, v: Int) {this + = k -> v} – srparish

+0

Я был укушен изменчивыми коллекциями, прежде чем я обычно остаюсь в стороне (см. scalaz). Вы могли бы подумать, что у них будут очень похожие реализации, но это не так. – Noah

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