gpt4 book ai didi

scala - 在 ObservableMap 上调用 update() 时不会调用事件订阅者

转载 作者:行者123 更新时间:2023-12-04 05:44:40 26 4
gpt4 key购买 nike

我创建了一个 ObservableMap 和一个只打印它接收到的任何事件的订阅者(取自 here):

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。++= 和 update 似乎都是根据 += 实现的(由 Growable 和 MapLike 可敬地),那么为什么它适用于一个而不适用于另一个?

最佳答案

HashMap 的可变版本调用 update ,后者又调用 put,它不调用 +=,因此不会调用 observable += 方法。我正在使用 Scala 2.9.1,但这对于 2.8 应该是相同的。

从哈希映射:

  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
}

关于scala - 在 ObservableMap 上调用 update() 时不会调用事件订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10836293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com