s 是 1..5 中每次循环的 值,i 存放的是每次的结果?这么简单的代码都不明白赶脚自己太笨了...
你理解错了吧。 inject 接受一个参数与一个 block(代码块)。inject 也可以不带参数,就像你这个例子。当不带参数时,s 的初始值就为循环数值的第一个值,那么 i 当然就为循环中的第二个值,接下来每当执行一次 block 时就把结果值赋给 s,i 就又去循环数值中的下一个值,直至取完。
我在之前也遇到过你这个问题,当时困扰了我很长时间,我试着用 each+ 回调的方法实现一下 inject,你可以试着再理解一下它的基本实现原理。希望这个对你有帮助。
#定义一个模块来自己实现一下inject方法 module Mymodule def myinject sum = 0 each do |number| #执行block,把临时结果保存在sum中 sum = yield(number,sum) end sum end end arr = [1,2,3] arr.extend Mymodule#使数据加载我们自定义的方法 result = arr.myinject { |d,i| i += d } puts result #结果是6
#1 楼 @jyootai 原来如此...感谢了!
我一直把 inject 当作 reduce 来用。
之前有一篇帖子讨论过 inject 和 reduce,在回帖中。 https://ruby-china.org/topics/7220
yield 的参数