我尝试从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),是否有人知道如何解决此问题?
答案 0 :(得分:4)
简短回答(仅适用于没有:paste
模式的REPL):
val a = ...
implicit val i = inbox()
您应该将self
而不是null
作为sender
方法的第二个参数(tell
)。方法!
隐式接受此参数并调用tell
。 ActorRef
范围内有2个隐式sender ! "hi"
:i
和self
(Act
字段) - 编译器无法确定您需要哪个。implicit val i
您应该从sender ! "hi"
的范围中删除a
。
正确的解决方案 - 将actor创建移动到方法和所有其他代码 - 移动到其他方法。在REPL中,您可以在i
之前创建i
。
快速脏解决方案 - 隐藏val a = {
val i = 0
actor(new Act {
...
}
,如下所示:
{{1}}