Ruby中的超时

时间:2017-10-09 03:09:36

标签: ruby timeout

我正在尝试进行数学测试。 我已经编写了这段代码但是控制台并不友好。 我试图让它打印得非常令人印象深刻,而且如果用户在5秒钟内完成就不会太慢。这是我写的。

puts "346*3?"
begin
  Timeout::timeout 5 do
    dans1 = gets.chomp
  end
rescue Timeout::Error
  dans1 = nil
end

puts (dans1 || "Too slow!")

if dans1 == "1038"
  puts "Very impressive!"
else
  puts "Better luck next time..."
end

忽略部分ifend这只是我的其余代码正常工作的片段。

谢谢!

2 个答案:

答案 0 :(得分:0)

您没有在外部范围内设置dans1,因此它只能在块内可见。我可能会重新编写代码;

puts "346*3?"
dans1 = begin
  Timeout::timeout 5 do
    gets.chomp
  end
rescue Timeout::Error
  "Too slow!"
end

puts dans1

if dans1 == "1038"
  puts "Very impressive!"
else
  puts "Better luck next time..."
end

如果您直接在控制台中键入此内容,即irb,您将遇到问题,因为在您当前正在输入的代码块中,获取将无效!您需要做的是将代码保存到文件并加载文件;

> load 'where-my-file-is/my-file.rb'

然后代码就可以运行了。或者你可以将它放入方法中;

def question
  puts "346*3?"
  dans1 = begin
    Timeout::timeout 5 do
      gets.chomp
    end
  rescue Timeout::Error
    "Too slow!"
  end

  puts (dans1)

  if dans1 == "1038"
    puts "Very impressive!"
  else
    puts "Better luck next time..."
  end
end

并调用方法;

> question

答案 1 :(得分:0)

问题是你如何声明dans1变量。作为练习,请尝试在救援中评论dans1 = nil行。突然:

in `<main>': undefined local variable or method `dans1' for main:Object (NameError)

这是因为您首先在此处定义了dans1

Timeout::timeout 5 do
  dans1 = gets.chomp
end

当你在一个块中定义一个新变量时,它是&#34; block-local&#34;,这意味着它不存在于该块之外。因此块退出然后puts尝试读取不存在的变量。您的代码首先工作的原因是因为救援中的dans1 = nil行定义了dans1可以看到的块外的另一个puts。无论rescue是否运行,都会出现此定义!这是关于Ruby最令人困惑的事情之一:VM看到dans = nil行并定义变量,即使分配没有运行。

要解决此问题,只需在阻止之前定义dans1即可。块可以在其范围之外看到,因此它将重用dans1而不是定义新的块本地变量。

dans = nil
begin
  ...