我正在将Java代码中的Akka UntypedActors转换为他们的Scala等价物.
但是,我无法理解如何正确实现receive()抽象方法.ScalaDoc有点令人困惑,我看到的大部分示例都涉及String消息!
我的Actor可以支持多种消息类型,这是我目前的解决方案:
override def receive = {
case message if message.isInstanceOf[ClassOne] => {
// do something after message.asInstanceOf[ClassOne]
}
case message if message.isInstanceOf[ClassTwo] => {
// do something after message.asInstanceOf[ClassTwo]
}
case message => unhandled(message)
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现上述目标?
override def receive = {
case c: ClassOne =>
// do something after message.asInstanceOf[ClassOne]
case c: ClassTwo =>
// do something after message.asInstanceOf[ClassTwo]
case message => unhandled(message)
}
Run Code Online (Sandbox Code Playgroud)
如果你正在使用案例类,你可以变得更复杂.
case class ClassOne(x: Int, y: String)
case class ClassTwo(a: Int, b: Option[ClassOne])
override def receive = {
case ClassOne(x, y) =>
println(s"Received $x and $y")
case ClassTwo(a, Some(ClassOne(x, y)) if a == 42 =>
// do something
case ClassTwo(a, None) =>
case c @ ClassOne(_, "foo") => // only match if y == "foo", now c is your instance of ClassOne
}
Run Code Online (Sandbox Code Playgroud)
各种有趣的东西.
receive的类型实际上只是一个PartialFunction[Any,Unit],这意味着你可以使用Scala的模式匹配表达式 - 事实上,你已经在做了,只是不完全简洁.一个等同的terser,它也可以让你处理每个案例的匹配类型:
def receive = {
case classOneMessage : ClassOne => {
// do something
}
case classTwoMessage : ClassTwo => {
// do something
}
case _ => someCustomLogicHereOtherWiseThereWillBeASilentFailure
//you can, but you don't really need to define this case - in Akka
//the standard way to go if you want to process unknown messages
//within *this* actor, is to override the Actor#unhandled(Any)
//method instead
}
Run Code Online (Sandbox Code Playgroud)
阅读旅游文章和已经链接的教程,了解有关模式匹配的更多信息,特别是在将该功能与案例类一起使用的背景下 - 这种模式在使用Akka时会定期应用,例如在处理Akka手册时该ActorIdentity案例类.
| 归档时间: |
|
| 查看次数: |
8551 次 |
| 最近记录: |