首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从执行元向调用方发送None

从执行元向调用方发送None
EN

Stack Overflow用户
提问于 2011-09-15 17:23:44
回答 1查看 232关注 0票数 2

我有一个简单的Actor,它使用ScalaQuery查询数据库,我为使用它的客户端测试模拟了它。

我想要的是,如果ID匹配,(模拟)参与者用Some(MyObject)回复,否则用None回复。然而,我不知道如何让它工作。以下是我到目前为止拥有的代码:

代码语言:javascript
复制
def receive = {
  case FetchSomething(someId) => {
    if (someId == 1234) self.channel ! someObject
    else self.channel ! None
  }
}

但是,它返回的不是客户端代码中的None,而是Some(None) -这当然会让我的客户端感到困惑。我希望客户端的工作方式是这样的:

代码语言:javascript
复制
val object = persister !! FetchSomething(1337) match {
    case myObject: Some[MyObject] => myObject
    case _ => None
}

(当然,上面的可能是错误的--而不是Some,它可能是Option)

我如何才能做到这一点?也许更具体一点,我如何通过self.channel发回一个None,以便在匹配它时,它是None而不是Some(None)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-15 18:17:00

错误出在客户端,它错误地解释了回复,没有遵循AKKA协议。来自the Akka documentation

The !!方法返回一个结果,如果成功返回,则为OptionAny;如果调用超时,则返回None。

因此,如果回复为None,则client Some(None)。如果回复是Some(12),你会得到Some(Some(12))。如果客户端收到无,这并不意味着参与者回复了无,这意味着参与者没有回复。

这是AKKA协议,它意味着客户端应该处理回复

代码语言:javascript
复制
case Some(answer) => process answer
case None => actor did not reply

然后,如果你的参与者碰巧回复了一个OptionSomething,那就是你的协议,这是另一个层:

代码语言:javascript
复制
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

当然,您还可以编写

代码语言:javascript
复制
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(_)

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7428615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档