Ruby中如何对指定索引的字符大写?代码报NilClass错误求解决
解决Ruby中特定索引字符大写及循环报错问题
首先,咱们先拆解你遇到的问题:undefined method 'upcase' for nil:NilClass这个错误,核心原因是循环范围写错了!Ruby里字符串的索引是从0到str.length - 1,但你用了0..str.length——当i等于str.length时,str[i]取不到任何字符,返回nil,自然调用不了upcase方法啦。
另外,你的代码逻辑里用upcase!直接修改原字符串的字符,会导致后续的capitalize失效(大写字符调用capitalize还是它本身),这也不符合Mumble格式的预期(比如第二个字符应该是Bb而不是BB)。
下面是修正后的完整代码,我会逐个说明改动点:
def mumble_letters print "Please write a string : " str = gets.chomp # 用chomp去掉输入末尾的换行符,比to_str更贴合需求 # 确保输入的字符串长度大于1(包含空输入的情况) while str.length <= 1 print "Please write a string : " str = gets.chomp end # 用0...str.length循环,三个点表示半开区间,不会包含str.length这个无效索引 (0...str.length).each do |i| current_char = str[i] # 首字符大写,后面拼接i次小写的当前字符 print current_char.upcase + current_char.downcase * i # 最后一个字符后不添加横线 print "-" unless i == str.length - 1 end puts # 最后换行让输出更整洁 end mumble_letters
关键改动说明:
- 修复循环范围:把
for i in 0..str.length改成(0...str.length).each do |i|,彻底避免取到nil的情况。 - 优化输入处理:用
gets.chomp替代gets.to_str,自动去掉用户输入时的换行符,避免字符串包含多余的\n。 - 调整大小写逻辑:不再修改原字符串,而是取出当前字符后,单独生成大写首字符+对应次数的小写字符,完美实现Mumble格式(比如输入
abcd会输出A-Bb-Ccc-Dddd)。 - 简化冗余代码:去掉了不必要的
str = nil初始化,调整循环条件为str.length <=1,覆盖空输入的场景。
现在运行这段代码,输入符合长度要求的字符串就能得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者Ioana C
相关产品推荐
相关产品推荐

