2011-09-15 88 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(_)

相關問題