我有一个简单的Actor,它使用ScalaQuery查询数据库,我为使用它的客户端测试模拟了它。
我想要的是,如果ID匹配,(模拟)参与者用Some(MyObject)回复,否则用None回复。然而,我不知道如何让它工作。以下是我到目前为止拥有的代码:
def receive = {
case FetchSomething(someId) => {
if (someId == 1234) self.channel ! someObject
else self.channel ! None
}
}但是,它返回的不是客户端代码中的None,而是Some(None) -这当然会让我的客户端感到困惑。我希望客户端的工作方式是这样的:
val object = persister !! FetchSomething(1337) match {
case myObject: Some[MyObject] => myObject
case _ => None
}(当然,上面的可能是错误的--而不是Some,它可能是Option)
我如何才能做到这一点?也许更具体一点,我如何通过self.channel发回一个None,以便在匹配它时,它是None而不是Some(None)
发布于 2011-09-15 18:17:00
错误出在客户端,它错误地解释了回复,没有遵循AKKA协议。来自the Akka documentation:
The !!方法返回一个结果,如果成功返回,则为OptionAny;如果调用超时,则返回None。
因此,如果回复为None,则client Some(None)。如果回复是Some(12),你会得到Some(Some(12))。如果客户端收到无,这并不意味着参与者回复了无,这意味着参与者没有回复。
这是AKKA协议,它意味着客户端应该处理回复
case Some(answer) => process answer
case None => actor did not reply然后,如果你的参与者碰巧回复了一个OptionSomething,那就是你的协议,这是另一个层:
case Some(answer) => /* your protocol */ answer match {
case Some(actualValue) => reply had actualValue
case None => None was the reply
}
case None => actor did not reply当然,您还可以编写
case Some(Some(actualValue)) =>
case Some(None) =>
case None => 注意,不要与x: Some[A]匹配(在泛型类型上匹配时,不要给出类型参数)。它不起作用,它不会验证您是否有Some[Something],但不会验证Something是否为A (请参阅类型擦除,编译器会给出警告)。您想要匹配case Some(x: A),它为您提供x格式的Some内容,这是您通常需要的。如果您实际上需要的是Some而不是它的内容,case s @ Some(x: A)会将s绑定到Some实例,将x绑定到它的内容。如果您对此不感兴趣,请使用_而不是x。
如果知道选项中的类型是A,那么不要提及它,只需编写case Some(x)、case s: Some(_)
https://stackoverflow.com/questions/7428615
复制相似问题