跳至内容

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 分支会立即完成,因此不会有任何等待。

执行将继续在已完成的分支中进行。如果分支条件是一个赋值语句,则选择调用的结果将被赋予目标变量。

标准库中的选择动作

标准库提供以下选择动作