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

Ruby中如何正确跳过迭代?inject方法报错求助

问题分析与修复

你犯的核心错误是没搞懂Ruby inject 块里 next 的行为逻辑:inject 每次迭代的块返回值会作为下一次的累加器(也就是代码里的sum)。当你写next if str.length ==4时,这个分支下块的返回值是nil,直接把累加器改成了nil,后续迭代执行sum + str.length时,自然就会抛出undefined method '+' for nil:NilClass的错误。

修复方案

只需要在跳过的时候,明确返回当前的累加器值,不让块返回nil即可:

strings = ["one", "two", "four", "abc", "fgh"]
total = strings.inject(0) do |sum, str|
  next sum if str.length == 4
 
  sum + str.length
end

puts total # 输出 12

这样遇到长度为4的字符串时,块返回当前的sum,累加器保持原值,后续迭代就能正常执行了。

更清晰的替代写法

如果觉得原逻辑不够直观,也可以先过滤掉不符合条件的元素,再做累加,代码可读性更强:

strings = ["one", "two", "four", "abc", "fgh"]
total = strings.reject { |str| str.length == 4 }.inject(0) { |sum, str| sum + str.length }

# 或者更简洁的sum写法
total = strings.sum { |str| str.length unless str.length == 4 }.compact.sum

内容的提问来源于stack exchange,提问作者Devmix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:56:13