gpt4 book ai didi

scala - 从 Actor 向调用者发送 None

转载 作者:行者123 更新时间:2023-12-01 05:10:47 26 4
gpt4 key购买 nike

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

我想要的是(模拟)Actor 在 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)

最佳答案

错误出在客户端,它误解了回复,不遵循 AKKA 协议(protocol)。来自 the Akka documentation :

The !! method returns an Option[Any] which will be either Some(result) if returning successfully, or None if the call timed out.

因此,如果回复为 None,则客户端为 Some(None)。如果回复是 Some(12) 你会得到 Some(Some(12))。如果 client 收到 None,那不应该意味着 actor 回复了 None,这意味着 actor 没有回复。

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

case Some(answer) => process answer
case None => actor did not reply

然后,如果您的 actor 恰好回复了一个 Option[Something],那就是您的协议(protocol),这是另一层:

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],但不会验证 SomethingA(请参阅类型删除,编译器给出警告)。您想要匹配 case Some(x: A),它会为您提供 xSome 的内容,这是您通常想要的。如果你真的想要 Some 而不是它的内容,case s @Some(x: A) 会将 s 绑定(bind)到 Some 实例,x 到它的内容。如果您对此不感兴趣,请使用 _ 而不是 x。

如果知道option里面的类型是A,那就不用提了,直接写case Some(x)case s: Some(_)

关于scala - 从 Actor 向调用者发送 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7428615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com