2

在 Java 中,onReceive 的声明包括对作为对象的消息的引用。

public void onReceive( Object message )
{
    if( message instanceof MyClass )
    {

然而,在 Scala 中没有这样的参考,并且案例是特定的

def receive {
  case "test" => println("ttt")
 }

有没有办法在 Scala 中访问收到的消息?例如,我想手动将任何未知消息转发给特定的参与者。就像是

def receive {
  case "test" => println("ttt")
  case _ => AnotherActor ! TheMessage
 }
4

3 回答 3

8

是的,这非常简单:

def receive {
  case "test" => println("ttt")
  case theMessage => AnotherActor ! theMessage
}
于 2013-05-14T11:48:13.930 回答
0

如果 Scala API 有一个currentMessage类似于sender. 当然,同样的警告也适用于不关闭参与者的 state/methods

例如,如果你的 Actor 响应了十几个消息,那么 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 中的原因)。

于 2013-05-14T19:12:49.877 回答
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" =>
})
于 2016-01-22T10:01:43.360 回答