如何阻止Ruby中if/elsif语句出现循环问题?
Ruby游戏决策循环问题的解决办法
你的代码出现循环无法推进的核心原因是:gets方法会读取用户输入时包含末尾的换行符(按下回车键产生的\n)。比如用户输入sleep回车后,decision实际是sleep\n,和你判断的sleep字符串完全不相等;同理输入get up回车后,decision是get up\n,也匹配不上get up,所以每次都会触发else分支,重新调用getup_or_sleep?方法,导致无限循环。
你只需要用chomp方法去掉输入字符串末尾的换行符,就能让判断逻辑正常工作,修正后的代码如下:
def getup_or_sleep? puts "Cole" puts "----" puts "Will you get up or go back to sleep?" # 用chomp移除输入末尾的换行符,确保和判断的字符串一致 decision = gets.chomp if decision == "sleep" puts "Cole" puts "----" puts "You decide to go back sleep. It is far too early." # 后续可以在这里添加跳转新方法的逻辑 elsif decision == "get up" Exposition.stretch else puts "输入无效,请输入'sleep'或者'get up'。" Exposition.getup_or_sleep? end end
额外提两个小建议:
- Ruby里语句末尾的分号
;不是必需的(除非一行写多个语句),去掉后代码会更整洁。 - 当前用递归处理无效输入的方式,在小游戏场景下没问题,但如果想更规范,也可以换成
loop循环结构来实现重复提示,避免递归深度过大的潜在问题。
内容的提问来源于stack exchange,提问作者Kez_Connected
相关产品推荐
相关产品推荐

