3

我尝试从 akk doc 实现 Actor DSL 示例,但发现错误,

模棱两可的隐式值:类型的特征收件箱(隐式收件箱:akka.actor.ActorDSL.Inbox)akka.actor.ActorRef 中的方法 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()

您应该传递self,而不是null作为方法的第二个参数 ( sender) tell。方法!隐式采用此参数并调用tell. 在:和( )ActorRef的范围内有 2 个隐含- 编译器无法确定您需要哪一个。sender ! "hi"iselfAct

您应该implicit val isender ! "hi".

正确的解决方案 - 将演员创建移动到方法和所有其他代码 - 到其他方法。在 REPL 中,您可以a在之前创建i.

快速肮脏的解决方案 -i像这样隐藏:

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