我正在使用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
答案 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