Ruby中的超时

Ruby中的超时,ruby,timeout,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 "Ver

我正在做数学测验。 我已经写了这段代码,但控制台对此并不友好。 我试图让它打印出来非常令人印象深刻,如果用户在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
忽略一些
if
s和
end
s这只是一个片段,我的其余代码可以正常工作


谢谢

您没有在外部范围中设置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)中键入此项,则会出现问题,因为GET无法在您当前输入的代码块中工作!您需要做的是将代码保存到一个文件并加载该文件

> 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

您没有在外部范围中设置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)中键入此项,则会出现问题,因为GET无法在您当前输入的代码块中工作!您需要做的是将代码保存到一个文件并加载该文件

> 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

问题在于如何声明
dans1
变量。作为练习,试着在rescue中注释掉
dans1=nil
行。突然:

in `<main>': undefined local variable or method `dans1' for main:Object (NameError)
在块内定义新变量时,它是“块局部变量”,这意味着它不存在于该块外。因此,块退出,然后
put
尝试读取不存在的变量。您的代码首先工作的原因是因为rescue中的
dans1=nil
行定义了
put
可以看到的块之外的另一个
dans1
。无论
rescue
是否运行,此定义都会出现!!!关于Ruby,这是最令人困惑的事情之一:VM看到
dans=nil
行并定义变量,即使赋值没有运行

要修复它,只需在块之前定义
dans1
。块可以看到其范围之外的内容,因此它将重用该
dans1
,而不是定义新的块局部变量

dans = nil
begin
  ...

问题在于如何声明
dans1
变量。作为练习,试着在rescue中注释掉
dans1=nil
行。突然:

in `<main>': undefined local variable or method `dans1' for main:Object (NameError)
在块内定义新变量时,它是“块局部变量”,这意味着它不存在于该块外。因此,块退出,然后
put
尝试读取不存在的变量。您的代码首先工作的原因是因为rescue中的
dans1=nil
行定义了
put
可以看到的块之外的另一个
dans1
。无论
rescue
是否运行,此定义都会出现!!!关于Ruby,这是最令人困惑的事情之一:VM看到
dans=nil
行并定义变量,即使赋值没有运行

要修复它,只需在块之前定义
dans1
。块可以看到其范围之外的内容,因此它将重用该
dans1
,而不是定义新的块局部变量

dans = nil
begin
  ...

这解决了问题,但根本无法解释最初的问题是什么place@Max这个问题是关于“控制台不友好”的,我专门回答这个问题。作用域是附加的,但GET将不会在控制台中运行。这修复了问题,但根本无法解释第一个问题是什么place@Max这个问题是关于“控制台不友好”的,我专门回答这个问题。作用域是附加的,但GET不会在控制台中运行。