2017-10-09 35 views
1

我正在尝试进行数学测试。 我已经写了这段代码,但控制台并没有对此友好。 我试图让它打印出来非常令人印象深刻,不会太慢,如果用户在5秒内进入正确的。这是我写的。Ruby中的超时问题

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这个只是一个片段我的代码的其余部分工作正常。

谢谢!

回答

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 
+0

这解决了这个问题,但不会在所有问题是摆在首位 – Max

+0

@Max关于“控制台不友善”我专门回答这个问题的问题陈述了解释。范围是一个额外的,但获取不会在控制台中运行。 – james2m

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 

当你定义一个块中一个新的变量,它是“块地方”,这意味着它不会以外的存在该块。所以块退出,然后puts尝试读取不存在的变量。您的代码首先工作的原因是因为救援中的dans1 = nil行定义了puts可以看到的块之外的另一个dans1。此定义发生rescue是否运行 !!!这是关于Ruby最令人困惑的事情之一:虚拟机看到dans = nil行,并且定义了变量,即使赋值没有运行。

要修复它,只需在块之前定义dans1即可。块可以在范围之外看到,所以它将重用dans1而不是定义新的块本地变量。

dans = nil 
begin 
    ...