0

我正在尝试让一个简单的 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
4

2 回答 2

2

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

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

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

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

有关详细信息,请参阅String.[] 。

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

break if str == "q"

if str.length < 4
  str = str.upcase
else
  str = str[0...-4] + str[-4..-1].upcase
end
p str
于 2014-02-11T01:27:17.680 回答
0

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

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

行会被打乱。例如。如果您键入“str”,那么您的代码将尝试执行以下操作:

length = 3

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

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

于 2014-02-11T00:58:31.290 回答