ruby 在 block 中注入(inject)条件?

标签 ruby inject

做第一个欧拉计划问题:将 1 到 1000 之间的 3 和 5 的倍数相加,我想到了这个(非常简单)

sum = 0
1.upto(999) { |i| sum += i if 0 == i%3 || 0 ==  i%5 }
sum

但我认为这行得通,但行不通,有人可以告诉我我做错了什么,或者为什么行不通吗?

1.upto(999).inject(0) { |sum, i| sum + i if 0 == i%3 || 0 ==  i%5 }

谢谢!

最佳答案

inject 将 block 的结果作为第一个参数传递到下一次迭代。当您的 if 语句为假时,您的 block 将返回 nil,然后作为 sum 传回。

为了得到正确的答案,当它为假时,该 block 应该返回当前的总和:

1.upto(999).inject(0) { |sum, i| (0 == i%3 || 0 ==  i%5) ? sum + i : sum }

关于 ruby 在 block 中注入(inject)条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10722913/

相关文章:

ruby - 将重定向缓存到 Sinatra 中的静态图像

c - 如何使用 c 扩展扩展我的 ruby​​ 类?

ruby - `Enumerable#inject` 中的 Symbol 与 Proc

android - 在android中模拟箭头键按下

c++ - 如何执行注入(inject)到进程中的应用程序

java - 创建@Inject 对象的顺序

ruby-on-rails - 如何在关闭 cache_classes 的情况下使用来自中间件的域对象?

ruby - 每当 Amazon SQS 队列更新时运行 Ruby 任务

Ruby 注入(inject)奇怪的行为

ruby - Ruby 中的条件 block