select¶
select
式は、一連のブロッキング操作から選択し、最初に利用可能になった分岐に進みます。
構文¶
式はキーワード select
で始まり、その後に1つ以上の when
分岐のリストが続きます。各分岐には、条件と本体があり、文の区切りまたはキーワード then
で区切られています。オプションで、最後の分岐は else
(条件なし) にすることができます。これは select
アクションがノンブロッキングであることを示します。式は end
キーワードで閉じられます。
注意
select
は、すべての分岐が潜在的にブロッキング操作を参照する case
式に似ています。
各条件は、select アクションの呼び出し、または右辺が select アクションの呼び出しである代入のいずれかです。
select
when foo = foo_channel.receive
puts foo
when bar = bar_channel.receive?
puts bar
when baz_channel.send
exit
when timeout(5.seconds)
puts "Timeout"
end
Select アクション¶
select アクション呼び出しは、暗黙の接尾辞 _select_action
を持つメソッド、または ?
接尾辞を持つ呼び出しの場合は _select_action?
を呼び出します。このメソッドは select アクションのインスタンスを返します。
select
式は、各分岐に関連付けられた select アクションを開始します。いずれかがすぐに戻った場合は、それを使用して続行します。それ以外の場合は、完了を待ちます。1つの分岐が完了するとすぐに、他のすべてがキャンセルされます。 else
分岐はすぐに完了するため、待機することはありません。
実行は完了した分岐で続行します。分岐条件が代入の場合、select 呼び出しの結果がターゲット変数に代入されます。
標準ライブラリの Select アクション
標準ライブラリは、次の select アクションを提供します
Channel#send_select_action
Channel#receive_select_action
Channel#receive_select_action?
::timeout_select_action