2011-09-15 53 views
2

我有一个简单的演员使用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)

回答

8

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

这个!!方法返回一个Option [Any],如果返回成功,将返回Some(结果) ;如果调用超时,则返回None。

所以如果回复是无,客户端一些(无)。如果答复是一些(12),你会得到一些(一些(12))。如果客户收到None,则不应该表示演员回复None,这意味着演员没有回复。

这是AKKA协议,这意味着客户端应该处理的答复与

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

那么如果你的演员恰好与选项[某件事]回复,这是你的协议,这是另一种层:

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)相匹配,它可以让你在x中的Some的内容,你通常想要的。如果您实际上想要Some而不是其内容,case s @ Some(x: A)将绑定sSome实例,x到其内容。如果您不感兴趣,请使用_而不是x。

如果已知选项里面的类型为A,那就不要客气,只是写 case Some(x)case s: Some(_)

相关问题