Scala 从参与者向调用者发送None

Scala 从参与者向调用者发送None,scala,option,actor,akka,Scala,Option,Actor,Akka,我有一个简单的Actor,它使用ScalaQuery查询数据库,我在测试使用它的客户机时模拟了它 我想要的是,如果ID匹配,(模拟)参与者使用Some(MyObject)回复,否则使用None回复。然而,我不知道如何使这项工作。以下是我目前掌握的代码: def receive = { case FetchSomething(someId) => { if (someId == 1234) self.channel ! someObject else self.chann

我有一个简单的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
}
(当然,上面的说法可能是错误的-可能不是
某些
,而是
选项


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

错误在于客户端,它误解了回复,没有遵循AKKA协议。发件人:

这个!!方法返回一个选项[Any],该选项将是Some(result) 如果返回成功,或如果呼叫超时,则为无

所以,如果回复为None,那么客户端会有一些(None)。如果回答是Some(12),你会得到Some(12)。如果客户机未收到任何回复,则不应表示参与者未回复任何回复,而是表示参与者未回复

这是AKKA协议,它意味着客户机应使用

case Some(answer) => process answer
case None => actor did not reply
然后,如果您的参与者碰巧使用选项[Something]进行回复,即您的协议,这是另一层:

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
而不是它的内容,那么
cases s@Some(x:A)
s
绑定到
Some
实例,
x
绑定到它的内容。如果您对x不感兴趣,请使用
而不是x

如果已知选项中的类型是
A
,则不必提及,只需编写
case-Some(x)
case-s:Some(41;