有没有人可以帮忙告诉我如何使用Scala的ObservableSet特征(trait)?
非常感谢您的帮助。
ObservableSet是一个扩展自Publisher特质的集合类型,它提供了基本的发布-订阅行为。一个简单的使用示例如下:
scala> class Counter(var count: Int) extends Publisher[String] {
def inc(): Unit = {
count += 1
super.publish("updated count to: " + count)
}
}
scala> class S[Evt, Pub] extends Subscriber[Evt, Pub] {
def notify(pub: Pub, event: Evt): Unit = println("got event: " + event)
}
defined class S
scala> val s = new S[String, Counter#Pub]
s: S[String,Counter#Pub] = S@7c27a30c
scala> val c = new Counter(1)
c: Counter = Counter@44ba70c
scala> c.subscribe(s)
scala> c.inc
got event: updated count to: 2
scala> class MySet extends HashSet[Int] with ObservableSet[Int] {
override def +=(elem: Int): this.type = super.+=(elem);
override def -=(elem: Int): this.type = super.-=(elem);
override def clear: Unit = super.clear;
}
defined class MySet
scala> val set = new MySet
set: MySet = Set()
scala> val subS = new S[Any, Any]
subCol: S[Any,Any] = S@3e898802
scala> set.subscribe(subS)
scala> set += 1
got event: Include(NoLo,1)
res: set.type = Set(1)
我一直懒得用任何类型定义S,但我无法立即正确地进行类型设置,并且没有花费太长时间来解决它。
这些打字信息有点让人不舒服,但这是我使它工作的方法。欢迎提出简化打字的建议。包括类型别名在内的各种编辑:
import collection.mutable._
import collection.script._
val set = new HashSet[String] with ObservableSet[String] { }
type Msg = Message[String] with Undoable
type Sub = Subscriber[Msg, ObservableSet[String]]
val sub = new Sub() {
def notify(pub: ObservableSet[String], event: Msg): Unit = {
println("%s sent %s".format(pub, event))
event match {
case r:Remove[_] => println("undo!"); event.undo()
case _ =>
}
}
}
set.subscribe(sub)
set += "foo"
set += "bar"
set -= "bar"
这将打印:
Set(foo) sent Include(NoLo,foo)
Set(bar, foo) sent Include(NoLo,bar)
Set(foo) sent Remove(NoLo,bar)
undo!
Set(bar, foo) sent Include(NoLo,bar)