Ruby:如果变量集

时间:2016-01-25 21:02:25

标签: ruby

我正在使用open3在ruby中执行命令,并且我使用safe_timeout gem设置超时(因为报告超时的已知问题here

我的代码非常简单:

SafeTimeout.timeout(t) do
  stdout, stdeerr, status = Open3.capture3(cmd)
  @output = stdout
  @result = status.exitstatus
  @pid = status.pid
  @timeout = t
end

这里需要注意的是,如果定义了t,我只想在超时块中运行它。

显然我可以使用if语句,但之后我会有重复的东西,并且它感觉不像#ruby-like"对我来说。

有没有一种很好的方式来做类似的事情:

if t
  timeout.do
    command
  end
else
  command_without_timeout
end

1 个答案:

答案 0 :(得分:4)

您可以使用Proc - Ruby代码块的改进版本。将命令放在proc中,然后将proc传递给timeout方法(使用&运算符将其作为块而不是普通参数传递)或者只是call它直接。例如:

block = proc do
  # this is the code I want to run
  # with or without the timeout 
  stdout, stdeerr, status = Open3.capture3(cmd)
  @output = stdout
  @result = status.exitstatus
  @pid = status.pid
  @timeout = t
end

if t then
  SafeTimeout.timeout(t, &block)
else
  block.call
end