![]() |
![]() |
![]() |
制御構造 | 目次 |
Reactor トレイトは戻り値を返さない react 演算のプログラミングを簡略化する制御構造を定義する。通常は、react の呼び出しは戻ってこない。もしアクターが続いてコードを実行したければ、アクターの継続コードを明示的に react に渡すか、継続を隠蔽する以下の制御構造を使わなければいけない。
最も基礎的な制御構造は andThen だ。これは、アクターが他の全てを実行した後で実行されるべきクロージャを登録する。
actor {
{
react {
case "おはよう" => // processing "おはよう"
}: Unit
} andThen {
println("あ、おはようございます")
}
}
具体例で説明すると、上記のアクターは "おはよう" メッセージを処理した後、挨拶を表示する。react の呼び出しは戻ってこないが、andThen を用いて挨拶を表示する継続を登録することができた。
react の呼び出しに続いて「みなし型」(type ascription) が指定されることに注意してほしい(: Unit)。 これにより、react の戻り値型が Unit であるとみなすことができる。式の結果はいつでも外すことができるので、これは合法だ。andThen が react の戻り値型である Nothing のメンバーになれないため、このような記述が必要になる。react の戻り値型を Unit とみなすことで暗黙の変換 (implicit conversion) が適用され、andThen をメンバーとすることができる。
アクター API は他にもいくつかの制御構造を提供する:
loop { ... }。中括弧で囲まれたコードを毎回実行するループを永久に周回する。ループの本文内で react を呼び出すとアクターは通常通りメッセージを処理することができる。その後、アクターの実行は同じループの次の周回へと続行する。loopWhile (c) { ... }。条件 c が true を返す間、中括弧で囲まれたコードを実行する。ループの本文内での react の呼び出しは loop 内で呼んだ場合と同じ結果になる。continue。現在の継続クロージャを用いてアクターの実行を続行する。 loop または loopWhile内で continue を呼び出すと、アクターは現在の周回を終え、次の周回へと続行する。 現在の継続が andThen を用いて登録された場合は、アクターの実行は andThen の第二引数に渡されたクロージャに続行する。制御構造は Reactor の act メソッドの本文内、もしくは act により(直接、または間接的に)呼び出されたメソッドの本文内ならどこでも使うことができる。actor { ... } 記法により作成されたアクターは、制御構造を Actor からインポートする必要がある。
![]() |
![]() |
![]() |
制御構造 | 目次 |