select¶
select
表達式從一組阻塞操作中選擇,並繼續執行首先可用的分支。
語法¶
表達式以關鍵字 select
開始,後面跟著一個或多個 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 行動。如果它們中的任何一個立即回傳,它就會繼續執行該分支。否則它會等待完成。一旦一個分支完成,所有其他分支都會被取消。else
分支會立即完成,因此不會有任何等待。
執行會繼續在已完成的分支中。如果分支條件是賦值,則 select 呼叫的結果會被賦值給目標變數。
標準函式庫中的 Select 行動
標準函式庫提供以下 select 行動
Channel#send_select_action
Channel#receive_select_action
Channel#receive_select_action?
::timeout_select_action