首页 > 解决方案 > 为什么我的 Ruby 代码没有按预期执行?

问题描述

我正在通过 Chris Pine 的《Learn to Program》一书学习 Ruby。在书中,有一个练习说:

编写聋奶奶程序。无论您对奶奶说什么(无论您输入什么),她都应该回应 HUH?!SPEAK UP, SONNY!,除非你大声喊出来(输入所有大写字母)。如果你大喊大叫,她会听到你的声音(或者至少她是这么认为的)并回喊:不,不是自 1938 年以来!为了让你的节目真正可信,让奶奶每次都喊出不同的年份;可能是 1930 年到 1950 年之间的任意一年。(这部分是可选的,如果你阅读方法一章末尾关于 Ruby 随机数生成器的部分会更容易。)你不能停止和奶奶说话,直到你喊再见。提示:不要忘记咀嚼!带 Enter 的“BYE”与不带 Enter 的“BYE”不同!提示 2:试着想想你的程序的哪些部分应该一遍又一遍地发生。所有这些都应该在您的 while 循环中。

我已经编写了我的代码,但它没有按预期工作。基本上,当我输入信息时,它遵循编写代码的顺序。例如,如果我输入“HELLO”,它会回复“HUH?!SPEAK UP,SONNY!但实际上它应该写回“NO,NOT SINCE 1938!”。

当我输入“BYE”时,除非我按照编写代码的顺序(我希望这是有道理的),否则什么都不会出现。

我已经尝试了很多东西,比如不使用 break (用于循环)。我试图把它写成一段没有任何 if 或 else 的长代码。

这是我写的代码:

puts 'Go speak to Grandma, she\'s in the kitchen!'
speaking = gets.chomp

if speaking == speaking.downcase 
  puts 'HUH?! SPEAK UP, SONNY!'
  gets.chomp

  while speaking == 'BYE'
  puts 'BYE! COME AGAIN SOON!'
  gets.chomp
  break
  end

else speaking == speaking.upcase
  puts 'NO, NOT SINCE 1983!' 
   gets.chomp

end

我希望当我写 HELLO 时能得到“不,不是自 1983 年以来!”的适当答案。此外,我希望对话继续进行,因为我在所有代码片段上都使用了 gets.chomp。sp为什么代码停止?

标签: ruby

解决方案


代码中的问题是if ... else条件未包含在循环中,因此不会重复执行。

提示 2:试着想想你的程序的哪些部分应该一遍又一遍地发生。所有这些都应该在你的while循环中

要使循环正常工作,您需要将所有可重复的行包含在循环中。
在你的情况下,循环应该只在输入时才会中断BYE

puts 'Go speak to Grandma, she\'s in the kitchen!'
speaking = gets.chomp

until speaking == 'BYE'
  if speaking == speaking.upcase
      puts 'NO, NOT SINCE 1983!'
  else
      puts 'HUH?! SPEAK UP, SONNY!'
  end

  # Get input before next loop
  speaking = gets.chomp
end

puts 'BYE! COME AGAIN SOON!'

您不需要明确检查小写,您只关心“输入是否仅包含大写字符”


推荐阅读