5

私は封印された特性を持っています:

sealed trait ActorMessage
case class AddX(x: Int) extends ActorMessage
case class RemoveX(x: Int) extends ActorMessage

また、すべてのメッセージを処理し、完全でない一致について警告する機能もあります。

def handleMessage: ActorMessage => Unit = {
  case AddX(x) => ...
  case RemoveX(x) => ...
}

アクターには PartialFunction[Any, Unit] が必要です。PartialFunction は Function を拡張します。つまり、自分の Function を PartialFunction に割り当てることはできません。

私は簡単なコンバーターを書きました:

def liftToPartialFunction[FUND <: PFUND, B, PFUND](f: Function[FUND, B]): PartialFunction[PFUND, B] = new PartialFunction[PFUND, B] {
  override def isDefinedAt(x: PFUND): Boolean = x.isInstanceOf[FUND]
  override def apply(v1: PFUND): B = f(v1.asInstanceOf[FUND])
}

しかし、これを行うためのより良い方法はありますか? または、標準のscalaライブラリに同等のものはありますか?

4

3 に答える 3

4

私は通常、次のようなことをします:

override def receive = {
  case m: ActorMessage => m match {
    // You'll get non-exhaustive match warnings here
    case AddX(x) => /* ... */
    case RemoveX(x) => /* ... */
  }
  case m => /* log a warning */
}

同様に、関数を使用してhandleMessage

override def receive = {
  case m: ActorMessage => handleMessage(m)
  case m => /* log a warning */
}
于 2015-07-15T09:17:12.553 に答える