2017-10-09 32 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 
    ...