5

別の俳優の信号を待って、俳優を「スリープ状態」にしようとしています。私は次のようなことをしたい:

def act(){
    loop{ //Should I use loop here too??
        if(sleepy){
            react{
                   //SLEEPING
                    case "Wake Up"=> sleepy=false; //just to breack the react
            }
        }else{
            react{
                 //React to other messages
            }
        }
    }
}

では、アクターが眠っているとき、他のメッセージはどうなるでしょうか? 彼らは失望しますか?私はそれらを失いたくない。これを修正する良い方法は何ですか?

4

2 に答える 2

6

andThenDon と同様のメカニズムを使用できますが、によって提供される機能を利用できますActor.Body

def waitForSignal : () => Unit = react { case Signal(_) => }

def processMessages : () => Unit = loop { 
  react {
      case x => //process
  }
}

def act() = waitForSignal andThen processMessages

戻り値の型を明示的に宣言する理由は、() => Unitreact正常に終了しない (つまり、 を返すNothing) ためです。Nothing型階層の最下部にあり、他の型の有効なサブタイプです。

メソッドを含むクラス() => Unitへのa からの暗黙的な変換を利用しています。BodyandThen

于 2010-07-15T19:04:30.263 に答える
6

反応ブロック内の他のケースでガードを使用できます。反応ブロック内の一致しないメッセージは、アクターのメッセージ キューに保持されます。キューのサイズが過剰になる前に、アクターが確実に「起床」することに注意してください。

私の記憶が正しければ、react の設計上、ループ内に 1 つの反応ブロックしか持てません。

val receiver = new Actor {
  private var sleeping = true

  def act {
    loop {
      react {
        case "Wake Up"       => println("waking up"); sleeping = false
        case x if ! sleeping => println("processing "+x)
      }
    }
  }
}

receiver.start

import Thread.sleep

receiver ! "Message 1"
sleep(2000L)
receiver ! "Message 2"
sleep(2000L)
receiver ! "Wake Up"
sleep(2000L)
receiver ! "Message 3"
sleep(2000L)
receiver ! "Message 4"

起床処理 メッセージ 1 処理 メッセージ 2 処理 メッセージ 3 処理 メッセージ 4

于 2010-07-15T15:07:31.560 に答える