我该如何修复这个Ruby的Yes/No-Style循环?

4

我有一个方法,使用while循环来重复n次请求用户输入。这个想法非常简单和常见,只要条件为真就重复while循环。问题是它不起作用...

def play_again?
  flag = true
  while flag
    print "Would you like to play again? [y/n]: "
    response = gets.chomp
    case response
      when 'y'
        Game.play
      when 'n'
        flag = false
    end
  end
  flag
end

play_again?

目前的代码只会成功地执行一次并退出,而不是循环执行,请问可能出了什么问题?

非常感谢。


2
刚刚在 Ruby 控制台中尝试了你的代码,它正常工作。 - Marian Theisen
1
如果你将 Game.play 替换为 puts "playing...",它就可以正常工作。你的 Game 中有些东西出了问题。 - steenslag
你们两个都是正确的。显然 Game.play 返回了 nil,我没意识到这可能是一个因素,因为循环变量是“无关”的。 - jlstr
没有任何问题。如果输入不是(小写)yn,则它会重复。在这种情况下Game.play没有任何问题,除了未定义之外。我只建议使用response = gets.chomp.downcase以接受YN - stslavik
Game.play 返回 nil 不应该退出你的 while 循环。 - steenslag
嗨!我修好了。正如第一条评论中所述,循环完全没有问题,问题与Game.play逻辑内部的某些完全不同的东西有关。谢谢你让我意识到我的循环几乎是正确的。非常感谢你的所有帮助,我都很欣赏。 - jlstr
1个回答

14

可能存在的问题:

  • 检查 Game.play
  • 答案大小写是否正确?-> 使用String#upcase或String#downcase
  • 隐藏的空格(答案前/后)-> 使用String#strip而不是String#chomp

您还可以使用正则表达式(示例N)或答案列表(是)来检查答案:

def play_again?
  while true
    print "Would you like to play again? [y/n]: "
    case gets.strip
      when 'Y', 'y', 'j', 'J', 'yes' #j for Germans (Ja)
        puts 'I play' # Game.play
      when /\A[nN]o?\Z/ #n or no
        break 
    end
  end
end

play_again?

你的循环更好,更简洁和惯用。感谢你让我意识到如何做得更好,而且基本上,我的版本也几乎可以。再次感谢。 - jlstr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接