3

ak doc から Actor DSL の例を実装しようとしましたが、エラーが見つかりました。

あいまいな暗黙の値: タイプ (暗黙のインボックス: akka.actor.ActorDSL.Inbox) のトレイト Inbox のメソッド senderFromInbox と、タイプ => akka.actor.ActorRef のトレイト Actor の値 self の両方が、期待される型 akka.actor と一致します。 .ActorRef

以下は私のコードです、

import akka.actor.ActorDSL._
import akka.actor.ActorSystem
import scala.concurrent.duration._
implicit val system: ActorSystem = ActorSystem("demo")

implicit val i = inbox()
val a = actor(new Act {
  become {
    case "hello" ⇒ sender ! "hi"
  }
})
a ! "hello"
val reply = i.receive()

ここでは「!」は使えません。メッセージを送信するには、sender.tell("hi", null)のように "tell" のみを使用できます。この問題を修正する方法を知っている人はいますか?

4

1 に答える 1

4

:paste短い答え (モードなしの REPL のみ):

val a = ...
implicit val i = inbox()

メソッドの2 番目のパラメーター ( )としてselfではなく、を渡す必要があります。メソッドは、このパラメーターを暗黙的に受け取り、 を呼び出します。スコープには 2 つの暗黙的:および(フィールド オブ) があり、コンパイラはどちらが必要かを判断できません。nullsendertell!tellActorRefsender ! "hi"iselfAct

implicit val iの範囲から削除する必要がありsender ! "hi"ます。

正しい解決策 - アクターの作成をメソッドに移動し、他のすべてのコードを他のメソッドに移動します。aREPL では、前に作成できましたi

クイックダーティーソリューション - 次のように非表示iにします。

val a = {
  val i = 0
  actor(new Act {
  ...
}
于 2013-07-25T07:58:09.603 に答える