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

自定义Ruby inject方法结果异常,求解析原因(Odin项目学习)

问题分析与修复

你的my_inject实现和Ruby官方版本的核心差异出在循环起始位置和初始值的完整处理上,咱们一步步拆解问题:

核心问题点

  1. 无初始值时的循环起始错误:
    当你不传start参数时,你把memo设为数组第一个元素self[0],但循环却从索引0开始,导致第一次迭代是用memo(5)和数组第一个元素(5)相加,这就多算了一次第一个元素,和官方inject逻辑不符——官方版本不传初始值时,会直接把第一个元素作为初始memo,然后从第二个元素开始迭代运算。

  2. 未处理传入初始值的场景:
    你的代码里虽然定义了start = nil参数,但完全没用到它,如果用户传入初始值,你的逻辑会直接忽略,还是用数组第一个元素作为memo,这显然不对。

修正后的代码

def my_inject(start = nil)
  # 处理memo的初始化
  if start.nil?
    return nil if self.empty? # 空数组无初始值时返回nil,和官方一致
    memo = self[0]
    start_index = 1 # 从第二个元素开始迭代
  else
    memo = start
    start_index = 0 # 有初始值时从第一个元素开始
  end

  # 遍历数组执行运算
  (start_index...self.length).each do |i|
    puts "#{memo}:#{self[i]} Results=#{yield(memo, self[i])}"
    memo = yield(memo, self[i])
  end

  memo
end

测试验证

调用你的测试代码:

[5,6,7,8,9,10].my_inject { |sum, n| sum + n }

现在输出日志会变成:

5:6 Results=11
11:7 Results=18
18:8 Results=26
26:9 Results=35
35:10 Results=45

最终返回45,和官方[5,6,7,8,9,10].inject(:+)的结果完全一致。

再测试传入初始值的场景:

[5,6,7,8,9,10].my_inject(10) { |sum, n| sum + n }

会从10开始累加,最终返回55,和官方结果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:31:10