我正在尝试进行数学测试。 我已经编写了这段代码但是控制台并不友好。 我试图让它打印得非常令人印象深刻,而且如果用户在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
和end
这只是我的其余代码正常工作的片段。
谢谢!
答案 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
...