如何在模式匹配中的案例之间共享逻辑

时间:2016-12-08 10:08:17

标签: scala akka

我有一个演员,我需要根据消息hierarhy做一些事情:

object MyActor {

    trait UpdateMessage
    case class UpdateOne() extends UpdateMessage
    case class UpdateTwo() extends UpdateMessage
    case class Other()

}

UpdateMessage上有相同的逻辑。您可以看到updateOneAndTwoLogic()两次来电:

class MyActor extends Actor {

    def receive: PartialFunction[Any, Unit] = {
        case UpdateOne() => {
          updateOneAndTwoLogic() //repeated
          updateOne()
        }
        case UpdateTwo() => {
          updateOneAndTwoLogic() //repeated
          updateTwo()
        }
        case Other() => {
          ...
        }
    }
}

在java api的UntypedActor中,我可以执行以下操作:

public void onReceive(Object message) {
    if (message instanceof UpdateMessage)
        updateOneAndTwoLogic();
    if (message instanceof UpdateOne)
        updateOne();
    if (message instanceof UpdateTwo)
        UpdateTwo();
    if (message instanceof Other)
        ...
}

updateOneAndTwoLogic()不重复。

如何删除scala版本中的重复调用?

1 个答案:

答案 0 :(得分:8)

您可以在Scala中使用模式匹配时使用|语法。

case msg @ (UpdateOne() | UpdateTwo()) => 
   updateOneAndTwoLogic()
   msg match {
     case UpdateOne() => updateOne()
     case UpdateTwo() => updateTwo()
   }

建议

使用case对象而不是带有空括号的case类。