来自Akka doc的Actor DSL示例

时间:2013-07-25 07:37:19

标签: scala akka

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

含糊不清的隐含值:两种方法senderFromInbox in trait收件箱类型(隐式收件箱:  akka.actor.ActorDSL.Inbox)akka.actor.ActorRef和特征值中的自我类型=>  akka.actor.ActorRef匹配预期类型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),是否有人知道如何解决此问题?

1 个答案:

答案 0 :(得分:4)

简短回答(仅适用于没有:paste模式的REPL):

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

您应该将self而不是null作为sender方法的第二个参数(tell)。方法!隐式接受此参数并调用tellActorRef范围内有2个隐式sender ! "hi"iselfAct字段) - 编译器无法确定您需要哪个。implicit val i

您应该从sender ! "hi"的范围中删除a

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

快速脏解决方案 - 隐藏val a = { val i = 0 actor(new Act { ... } ,如下所示:

{{1}}