新手问题 (1..5).inject { |s, i| s *= i } 这句求阶乘的代码中 i 是哪里来的呢

ted · 2014年10月26日 · 最后由 zkai 回复于 2014年10月27日 · 2032 次阅读

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 的参数

需要 登录 后方可回复, 如果你还没有账号请 注册新账号