我有问题,从递归函数返回值。红宝石递归函数
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