Ruby 的动态注入(inject)方法不起作用

标签 ruby

在 irb 中,为了检查注入(inject)方法的工作,我写下了简单的代码来打印可被 3 整除的数字的计数,但不知何故出现了故障:

[1,2,3,4].inject(0) do |count,value|
    if value % 3 == 0
       count = count + 1
    end
end

这是一件小事,但我没有捕获它。

最佳答案

inject ,您需要在每次迭代时返回备忘录元素:

[1, 2, 3, 4].inject(0) do |count, value|
  if value % 3 == 0
    count = count + 1
  end

  count
end
#=> 1

或者,如果您更喜欢单行版本:

[1, 2, 3, 4].inject(0) { |c, v| c += 1 if v % 3 == 0; c }
#=> 1

值得注意。在某些情况下,您可以替换为 inject对于 each_with_object , 并避免必须返回 memo 对象,但由于后者的返回值是传入的原始对象,它只适用于通过引用传递的对象(即不是 Fixnums.)

[1, 2, 3, 4].each_with_object(0) { |v, c| c += 1 if v % 3 == 0 }
#=> 0

关于Ruby 的动态注入(inject)方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34171600/

相关文章:

ruby-on-rails - Ruby on Rails : Array to Hash with (key, 值数组)

ruby - Vagrant File Chef 属性

ruby-on-rails - 如何将数据从我的生产数据库传输到 heroku 中的登台数据库?

ruby-on-rails - 如何随机化 Rails 查找器方法的结果排序?

ruby - 为什么我不能通过 Homebrew 软件安装 ruby​​ 1.9.3-p488?

ruby - 编写一个比较两棵树的函数,如果它们在结构和值上相等则返回 true,否则返回 false

jquery - AJAX 请求 POST 数据到 Rails Controller 给出 404

ruby-on-rails - 如何让 Ruby/Homebrew/RVM 在 Yosemite 上运行?

ruby - 在 Ruby 中转换为日期时间和时间

ruby - 在 Ruby 中做每一个,如何在每 n 个项目中放置一个 br