做第一个欧拉计划问题:将 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/