Ruby 循环赢了';t break和string赢了';你不能适当地资本化吗?

Ruby 循环赢了';t break和string赢了';你不能适当地资本化吗?,ruby,eclipse,loops,break,upcase,Ruby,Eclipse,Loops,Break,Upcase,我正在尝试让一个简单的Ruby程序正确运行 我需要它接受用户输入,直到用户键入“退出”的q。它还需要将用户输入的最后四个字母大写,如果输入的字母少于四个,则需要将所有字母大写 它只适用于超过四个字母的输入,当我输入“quit”时,它会得到一个零错误 请参阅下面的代码 我正在使用Eclipse和Ruby 2.0 puts ("\n" * 10) loop do puts "Please enter a word. (To quit type q.)" # Gets the users

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

我需要它接受用户输入,直到用户键入“退出”的
q
。它还需要将用户输入的最后四个字母大写,如果输入的字母少于四个,则需要将所有字母大写

它只适用于超过四个字母的输入,当我输入“quit”时,它会得到一个零错误

请参阅下面的代码

我正在使用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,那么长度-5将返回一个负数,并且

str[0..(length-5)] + ...
线路将被打乱。例如如果键入“str”,则代码将尝试执行以下操作:

length = 3

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

这没有道理。此外,由于您在末尾检查str==“q”,因此“q”也可能发生这种情况。移动支票并在块中拆分,确保不要将所有字符串都视为长度超过4个字符。

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

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
如果str==“q”则中断
如果str.length<4
str=str.upcase
其他的
str=str[0…-4]+str[-4…-1]。upcase
结束
p str

好的,我移动了中断,程序正确退出。我不确定我是否理解在4个字母和所有大写字母下的任何输入。我可以去掉这行的-5部分吗?谢谢dckuehn的快速回答!!哈那很有效!你解释得很好!谢谢Windor C!