select¶
select
表达式从一组阻塞操作中进行选择,并首先处理第一个可用的分支。
语法¶
表达式以关键字 select
开头,后面跟着一个或多个 when
分支的列表。每个分支都有一个条件和一个主体,用语句分隔符或关键字 then
分隔。可选地,最后一个分支可以是 else
(不带条件)。这表示 select
动作为非阻塞。表达式以 end
关键字结束。
注意
select
类似于一个 case
表达式,所有分支都指向可能阻塞的操作。
每个条件都是对选择动作的调用,或者是一个赋值语句,其右侧是对选择动作的调用。
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_action
,或者对于带有 ?
后缀的调用,则为 _select_action?
。该方法返回选择动作的实例。
select
表达式启动与每个分支关联的选择动作。如果它们中的任何一个立即返回,则它将继续处理该分支。否则,它将等待完成。一旦一个分支完成,所有其他分支都会被取消。else
分支会立即完成,因此不会有任何等待。
执行将继续在已完成的分支中进行。如果分支条件是一个赋值语句,则选择调用的结果将被赋予目标变量。
标准库中的选择动作
标准库提供以下选择动作
Channel#send_select_action
Channel#receive_select_action
Channel#receive_select_action?
::timeout_select_action