我有問題,從遞歸函數返回值。紅寶石遞歸函數
def ask_question(question)
print question
answer = STDIN.gets.chomp
ask_question question if answer.empty?
return answer
end
第一次答案正常返回,但我得到了在明年調用空字符串。 這是爲什麼?
我有問題,從遞歸函數返回值。紅寶石遞歸函數
def ask_question(question)
print question
answer = STDIN.gets.chomp
ask_question question if answer.empty?
return answer
end
第一次答案正常返回,但我得到了在明年調用空字符串。 這是爲什麼?
那是因爲你沒有返回你的遞歸調用返回ask_question
值。
def ask_question(question)
print question
answer = STDIN.gets.chomp
answer = ask_question question if answer.empty?
return answer;
end
當您完成方法時,您所做的只是返回第一個用戶輸入值(在您的情況下爲空字符串)。
您的代碼不起作用,因爲answer
返回它的變量總是一個在第一次迭代(每次通話都有自己的本地範圍內)。因此,一個可能的解決方案是:
def ask_question(question)
print question
answer = STDIN.gets.chomp
answer.empty? ? ask_question(question) : answer
end
不過,請注意這個遞歸結構是罰款與支持尾調用優化的語言,但Ruby沒有強迫它,所以它通常會爲每個迭代一個新的堆棧幀最終它會吹。我建議循環,例如:
def ask_question(question)
loop do
print question
answer = STDIN.gets.chomp
break answer unless answer.empty?
end
end
爲了證明@ tokland的角度來看,如果你運行你的程序,並按下回車鍵幾次,然後打`CTRL + c`(對於* nix),您會看到一個堆棧跟蹤與您輸入的次數成比例。 – Jeremy 2010-12-23 11:47:59
謝謝,我已經想通了我的錯誤已經... – Alex 2010-12-25 19:09:38