如何阻止Ruby if/elsif语句循环?



我通过制作一个小游戏来自学Ruby,以测试我对这门语言的感觉。我的代码运行得相当顺利,直到我遇到了一个问题,即游戏的第一个决策循环而不是向前发展。

这段代码是我在游戏介绍中使用的一小部分代码。

def getup_or_sleep?
puts"Cole";
puts"----";
puts"Will you get up or go back to sleep?";
decision = gets
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;
Exposition.getup_or_sleep?
end

这是我希望达到的预期结果:

科尔

你要起床还是继续睡觉?如果玩家选择'sleep'

1)科尔你决定回去睡觉,现在还太早。*我打算做一个新的方法来引导用户,但是我想先解决这个问题。

**如果玩家选择"起床"→在祝辞伸缩同一个类中的方法

我是编码新手,所以我可能会对一些事情感到困惑。提前感谢!=)

你的方法递归地调用自己,因为它所有的条件都失败了,它总是回到else分支。

发生这种情况是因为gets从用户读取输入并返回输入,包括,当用户按回车键时添加的不可见换行符。但是您的条件不包括这样的新行字符。

一个常见的Ruby习惯用法是调用gets.chomp来获取用户输入,其中chomp从输入中删除换行符。

decision = gets改为

decision = gets.chomp

修复您的问题。

除此之外,您的代码没有遵循Ruby的习惯用法,例如,Ruby不需要在行尾添加;,或者您通常在方法名称和它的参数之间添加空白,就像puts "Cole"一样。因此,我建议像这样格式化你的代码:

def getup_or_sleep?
puts 'Cole'
puts '----'
puts 'Will you get up or go back to sleep?'

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
Exposition.getup_or_sleep?
end
end

或者使用case块和一些重复提取到方法中:

def greeting
puts 'Cole'
puts '----'
end
def getup_or_sleep?
greeting
puts 'Will you get up or go back to sleep?'

case gets.chomp
when 'sleep'
greeting
puts 'You decide to go back sleep. It is far too early.'
when 'get up'
Exposition.stretch
else
Exposition.getup_or_sleep?
end
end

最新更新