在Java中,onReceive的声明包括对作为对象的消息的引用。
public void onReceive( Object message )
{
if( message instanceof MyClass )
{
但是在Scala中,没有包含此类参考,并且具体情况
def receive {
case "test" => println("ttt")
}
有没有办法在Scala中访问收到的邮件?例如,我想手动将任何未知消息转发给特定的actor。像
这样的东西def receive {
case "test" => println("ttt")
case _ => AnotherActor ! TheMessage
}
答案 0 :(得分:8)
是的,这非常简单:
def receive {
case "test" => println("ttt")
case theMessage => AnotherActor ! theMessage
}
答案 1 :(得分:0)
如果Scala API的currentMessage
与sender
类似,那就太好了。当然,同样的警告不适用于closing over the actor's state/methods。
例如,如果您的演员对十几条消息做出回应,则om-nom-nom建议的方法可能不切实际。
以下是解决问题的一种方法:
var currentMessage: Any = _
object saveMessage extends Receive {
def isDefinedAt(x: Any) = { currentMessage = x; false }
def apply(x: Any) { throw new UnsupportedOperationException("saveMessage apply") }
}
def receive = saveMessage orElse {
case Foo(x) => // do something special for Foo
case Bar(y) => // something different for Bar
case Baz(z) => // something else
case Bip(a) => // etc
case Bop(b, c) => .......
}
假设所有上述操作最终都需要在某个时刻调用一个需要访问当前消息的公共方法,这可能会派上用场。
但是再一次 - 永远不要关闭currentMessage
(我猜这种危险就是为什么它不在当前的API中)。
答案 2 :(得分:0)
我使用这个辅助方法(基于sourcedelica)
def extractMessage(msgToReceive: Any => Receive): Receive = {
var msg: Any = null
new Receive {
def isDefinedAt(x: Any) = {
msg = x
false
}
def apply(x: Any) {
???
}
} orElse msgToReceive(msg)
}
用法:
override def receive = extractMessage( msg => {
//your normal receive cases here:
case "one thing" =>
case "another" =>
})