2011-09-15 7 views
2

私は、ScalaQueryを使用してデータベースを照会するシンプルな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 
} 

(もちろん、上記は単に間違っている可能性があります - 代わりにSomeの、それはOptionことができる)

どのように私はこれを達成することができますか?おそらくもっと具体的には、Noneをself.channelに送り返すにはどうすればいいですか?一致させるときはNoneで、Some(None)ではないのですか?

答えて

8

障害がクライアントにあります。これは、AKKAプロトコルに従わない応答を誤って解釈します。 〜からthe Akka documentation

!メソッドは、成功した場合はSome(結果) 、呼び出しがタイムアウトした場合はNoneのいずれかのOption [Any]を返します。

返信がない場合、クライアントSome(None)。返信が一部の場合は(12)一部を取得します(一部(12))。クライアントがNoneを受け取った場合、アクターが返答したことを意味するべきではありません。これは、アクターが応答しなかったことを意味します。

これはアッカプロトコルあり、そしてそれはあなたの俳優がオプション[何か]と返信して発生した場合、クライアントは次に

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)と一致させたい場合は、Someの内容をxに入れます。通常は何をしたいのですか?コンテンツではなくSomeが実際に必要な場合は、case s @ Some(x: A)はをSomeインスタンスにバインドします(x)。興味がない場合はxの代わりに_を使用してください。オプション内部のタイプがAであることが知られている場合

、そしてちょうど書き、それを言及していない case Some(x)case s: Some(_)

関連する問題