質問

俳優に追加できるリスニング可能な/リスナーの特性を実装しました。このスタイルの特性を俳優に明示的に呼び出す必要がないかどうか疑問に思っています リスナーハンドラー 方法?

また、Akka Libraryでこの機能を見つけることを期待していました。私は何かが足りないのですか、それともAkkaがこれを含めない理由はありますか?

trait Listenable { this: Actor =>
    private var listeners: List[Actor] = Nil

    protected def listenerHandler: PartialFunction[Any, Unit] = {
        case AddListener(who) => listeners = who :: listeners
    }

    protected def notifyListeners(event: Any) = {
        listeners.foreach(_.send(event))
    }
}

class SomeActor extends Actor with Listenable
{
    def receive = listenerHandler orElse {
        case Start => notifyListeners(Started())
        case Stop => notifyListeners(Stopped())
    }
}
役に立ちましたか?

解決

拡張してみませんか Actor 直接、または非俳優をリッスン可能にしたい場合は、リスニング可能な俳優を拡張するリスニングアブアクターを作成しますか?

その後、オーバーライドします receive あなたが上で行ったように俳優で(あなたが電話したいことを除いて super.receive また、あなたはそうではありませんか? - あなたはただ渡された関数を変更したいだけです)。

他のヒント

俳優を拡張して使用することをお勧めします abstract override.

なぜ私はこの質問を以前に見たことがなかったのですか?

http://doc.akka.io/docs/akka/snapshot/scala/routing.html

ソリューション(最初のSCALAの例の修正バージョン)は次のとおりです。

import se.scalablesolutions.akka.actor.Actor

case class AddListener(who: Actor)
case class RemoveListener(who: Actor)

class ListenableActor extends Actor {
    private var listeners: List[Actor] = Nil

    def receive = {
        case AddListener(who) => listeners ::= who
        case RemoveListener(who) => listeners.filter(_ ne who)
    }

    protected def notifyListeners(event: Any) = {
        listeners.foreach(_.send(event))
    }
}

class ImplementingActor extends ListenableActor {
    override def receive = {
        super.receive orElse {
            case Message(content) => println(content)
        }
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top