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
相关产品推荐
相关产品推荐

