You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:22:33