自定义Ruby inject方法结果异常,求解析原因(Odin项目学习)
问题分析与修复
你的my_inject实现和Ruby官方版本的核心差异出在循环起始位置和初始值的完整处理上,咱们一步步拆解问题:
核心问题点
无初始值时的循环起始错误:
当你不传start参数时,你把memo设为数组第一个元素self[0],但循环却从索引0开始,导致第一次迭代是用memo(5)和数组第一个元素(5)相加,这就多算了一次第一个元素,和官方inject逻辑不符——官方版本不传初始值时,会直接把第一个元素作为初始memo,然后从第二个元素开始迭代运算。未处理传入初始值的场景:
你的代码里虽然定义了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
相关产品推荐
相关产品推荐

