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

How can I stop Ruby if/elsif statement from looping?

提问人:Kez_Connected 提问时间:11/23/2022 更新时间:11/24/2022 访问量:51

问:

我通过制作一个小游戏来自学 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 方法。

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

Ruby if-statement 方法 语法错误

评论

0赞 Stefan 11/23/2022
使用您的方法,每个方法都会调用另一个方法,但实际上永远不会返回。在游戏运行中,您将以这种方式构建大量方法调用。最好让每个方法返回新的播放器状态,例如 或。然后,您可以决定如何处理主游戏循环中的当前状态。:sleeping:stretching

答:

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
我做了一些研究,我也了解“案例”的用法!非常感谢。