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

0

Scala APIcurrentMessagesender. もちろん、アクターの state/methods をクローズしない場合にも同じ注意事項が適用されます。

たとえば、アクターが多数のメッセージに応答する場合、om-nom-nom で提案された方法は実用的ではない可能性があります。

この問題を解決する 1 つの方法を次に示します。

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 に答える