提问人:Kez_Connected 提问时间:11/23/2022 更新时间:11/24/2022 访问量:51
如何阻止 Ruby if/elsif 语句循环?
How can I stop Ruby if/elsif statement from looping?
问:
我通过制作一个小游戏来自学 Ruby,以测试我对这门语言的感受。我的代码运行得相当顺利,直到我遇到一个问题,即游戏的第一个决定循环而不是向前推进。
这段代码是我在游戏的 Exposition 中短暂使用的代码。
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
这是我希望达到的预期结果:
科尔
你会起床还是回去睡觉?如果玩家选择“睡眠”
1)科尔
你决定回去睡觉,现在还为时过早。 *我计划制作一种新方法来引导用户访问,但我首先想解决这个问题。
**如果玩家选择“起床” ->>> 到同一类内部的 stretch 方法。
我是编码新手,所以我可能会对一些事情感到困惑。提前致谢!=)
答:
2赞
spickermann
11/23/2022
#1
您的方法以递归方式调用自身,因为它的所有条件都失败,并且它总是回退到分支。else
发生这种情况的原因是读取用户的输入并返回输入,包括用户按回车键时添加的不可见换行符。但是您的条件不包括此类换行符。gets
一个常见的 Ruby 习惯语是 call 以获取用户输入,其中 chomp
从输入中删除换行符。gets.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
评论
2赞
Chris
11/23/2022
可能还有case decision.downcase ... end
1赞
spickermann
11/23/2022
好主意,但我不想在我的回答中引入太多新概念。
0赞
Kez_Connected
11/24/2022
谢谢!我只是使用了 ;因为有人告诉我哈哈。
1赞
Kez_Connected
11/24/2022
我做了一些研究,我也了解“案例”的用法!非常感谢。
评论
:sleeping
:stretching