跳到內容

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 行動