2010-05-31 2 views

ответ

2

Это немного бельмо на глазу со всей информацией для ввода текста, но именно так я смог заставить его работать. Я приветствую предложения о том, как сделать ввод более кратким. различных правок включая псевдонимы типа:

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) 

Интересно, что отменить вызванные еще одно сообщение будет опубликовано ...

+0

Большое спасибо, очень полезно! – barroco

8

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] = [email protected] 

scala> val c = new Counter(1) 
c: Counter = [email protected] 

scala> c.subscribe(s) 

scala> c.inc 
got event: updated count to: 2 

ObservableSet делает что-то подобное, он вызывает метод публиковать когда элементы добавлены или удалены с + = или + - метод, следующий пример (с классом S определен как указано выше):

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] = [email protected] 

scala> set.subscribe(subS) 

scala> set += 1 
got event: Include(NoLo,1) 
res: set.type = Set(1) 

Я Beem ленивым, определяя S с типами Любой, но я не мог получить печатать прямо сразу, а не тратить слишком много времени, пытаясь понять его.

+0

Спасибо большое, очень полезно! – barroco

+1

Красивый пример. Отсутствует 'val c = Counter (0)' в первом, хотя. – Brian

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