ruby - 为什么 ruby​​ 的 inject 不能正确求和?

标签 ruby enumerators

我没有从整数中的以下猴子修补方法得到正确的结果:

def harm
  1 + (2..self).inject{|sum, x| sum + 1/x.to_r}
end

2.harm #=> 3

它应该返回 3/2,我的错误在哪里?

最佳答案

这里有两个问题:

  1. 当您遍历一个闭合范围时,例如 2..2,实际上什么也没有发生:

    (0..0).inject(){|s, x| s+= 99 }
    # => 0
    

    这就是您得到 3 的原因,因为 1 + 23

  2. 如果您没有将参数传递给 inject,它会使用您传递给迭代器的第一个值作为开始备忘录,即 2:

    (2..2).inject(){|s, x| s+= 99 }
    #=> 2
    

    输入 0 会得到一个实际的迭代:

    (2..2).inject(0){|s, x| s+= 99 }
    #=> 99
    

所以在你的方法中试试这个:

1 + (2..self).inject(0){|sum, x| sum + 1/x.to_r}  

独立的:

1 + (2..2).inject(0){|sum, x| sum + 1/x.to_r}  
#=> 3/2

关于ruby - 为什么 ruby​​ 的 inject 不能正确求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19346041/

相关文章:

Java - 使用点符号创建枚举

asp-classic - ASP Classic FOR EACH 循环是如何工作的

c# - 什么是 C# 迭代器和生成器,我该如何使用它们

ruby-on-rails - Ruby on Rails : RSpec and Acts As Audited (disabling acts_as_audited while testing?)

jquery - 世界上最愚蠢的人(我)的 Rails 教程?

ruby-on-rails - 自引用关联的 Rails 数据库约束

ruby-on-rails - 如何在 Ruby 中从 Savon 调用此安全 Web 服务 WSDL?

ruby - 使用 watir-webdriver 验证滚动按钮是否适用于预加载数据