2016-10-13 5 views
2

は、私は別の状態を管理する俳優は、たとえばいる:は、アッカの俳優が同じコードを実装することなく、すべての状態で特定のメッセージをキャプチャすることができ

case object Start 
case object Stop 
case object Init 

class Foo extends Actor { 

def receive: Receive = { 
    case Init => 
     doSomeInit() 
     context become busy 
     self ! Start 
    case Stop => 
     context stop self 

    } 
} 
def busy: Receive = { 
    case Start => 
    doingSomeProcessing() 
    context become receive 
    case Stop => 
     context stop self 
} 
} 

は、私は(すべての状態にに似停止処理コードを書き込まないようにしたいですFSMで扱われていない場合) FSMを使用せずにそれを行う慣用方法ですか?

答えて

5

orElseを使用し、共通メッセージを部分機能に分割します。 receiveおよびbusyは部分的な機能です。下のコードに示すように、部分関数をorElseを使用して構成することができます。

オーダーが重要です。だから、f1 orElse f2またはf2 orElse f1 F1、F2ある部分関数

case object Start 
    case object Stop 
    case object Init 

    class Foo extends Actor { 

    def common: Receive = { 
     case Stop => 
     context stop self 
    } 

    def receive: Receive = common orElse { 
     case Init => 
     context become busy 
     self ! Start 
    } 

    def busy: Receive = common orElse { 
     case Start => 
     context become receive 
    } 
    } 

ScalaのREPL

scala> val f: PartialFunction[Int, String] = { case 1 => "one"} 
f: PartialFunction[Int, String] = <function1> 
scala> val g: PartialFunction[Int, String] = { case 2 => "two"} 
g: PartialFunction[Int, String] = <function1> 
scala> val x = f orElse g 
scala> f(1) 
res9: String = "one" 
scala> x(2) 
res10: String = "two" 
scala> x(1) 
res11: String = "one" 
+0

感謝を行い、私はあなたが ヴァルを逃したと思うユースケースに基づいて、X = G orElse F REPLで例 – igx

+0

@igx ..それを修正しました。提案のおかげで – pamu

関連する問題