循环不会中断,字符串不会正确大写?



我正在尝试让一个简单的Ruby程序正确运行。

我需要它来接受用户输入,直到用户键入"退出"q。它还需要将用户输入的最后四个字母大写,并且对于四个字母下的输入,将所有字母大写。

仅适用于超过四个字母的输入,当我输入"quit"时,它得到一个 nil 错误。

请参阅下面的代码。

我正在使用 Eclipse 和 Ruby 2.0。

puts ("n" * 10)
loop do
  puts "Please enter a word. (To quit type q.)"   # Gets the users input
  puts ("n" * 3)               #Scroll the screen 3 times
  str = gets.chomp              #Collect the player's response
  puts ("n" * 3)               #Scroll the screen 3 times
  length = str.length           # Counts length of string
  str = str[0..(length-5)] + str[(length-4)..length].upcase # Only makes last four letters of user input capitalized
  puts str                      # Shows on screen the user input with capitalized last four letters
  puts ("n" * 3)               #Scroll the screen 3 times
  break if str == "q"
end

编写这样的代码时需要注意[]

str = str[0..(length-5)] + str[(length-4)..length].upcase

如果索引为负数,则从字符串末尾开始计数。例如:

str = "abcde"
str[-1] # => "e"
str[-2] #=> "d"

请参阅字符串。[] 了解更多详情。

关于你的问题,这是我的逻辑:

break if str == "q"
if str.length < 4
  str = str.upcase
else
  str = str[0...-4] + str[-4..-1].upcase
end
p str

你需要对你的长度做一些检查。 如果长度小于 4,则长度 - 5 将返回负数,并且您的

str[0..(length-5)] + ...

行会心烦意乱。 例如。 如果您键入"str",那么您的代码将尝试执行以下操作:

length = 3
str[0..-2] + str[-1..3]

这没有意义。 此外,由于您在最后检查 str == "q",因此 "q" 也可能发生这种情况。 移动你的支票并在块中分解,并确保你不要将所有字符串视为长度超过 4 个字符。