我有一个演员,我需要根据消息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版本中的重复调用?
答案 0 :(得分:8)
您可以在Scala中使用模式匹配时使用|
语法。
case msg @ (UpdateOne() | UpdateTwo()) =>
updateOneAndTwoLogic()
msg match {
case UpdateOne() => updateOne()
case UpdateTwo() => updateTwo()
}
建议
使用case对象而不是带有空括号的case类。