题
假设@houses阵列被设置如下:
house1.price = 10
house2.price = 20
house3.price = 30
@houses << house1
@houses << house2
@houses << house3
这是我们计算的起点,我们希望找到一所房子均价:
total = 0
average = 0
for h in @houses
total += h.price
end
average = total/@houses.size
这似乎是相当多的打字只是为了得到一个平均的。
有没有更好的办法?
解决方案
上可枚举集合使用 inject
方法。注入允许您在初始值传递给一个“累加器”(0在这种情况下),然后应用一些操作以在列表中的每个元素,并返回储液器要传递到下一次迭代的新值。
蓄能器的最终值然后从inject
呼叫返回。
因此,在这种情况下,我们只是添加了所有的房价到累加器,然后最后由总数量除以。
您可以得到funkier,可能与一些红宝石的skillz更压缩了下去,但是这是可以理解的合理,并通过列表只迭代一次,加起来的值。
@houses.inject(0){|total, house| total + house.price} / @houses.size
其他提示
Madlep的答案将在从过去几年的Ruby的任何版本。但如果你使用Ruby 1.8.7或更高版本,可以更简洁地表达它一点点@houses.collect(&:price).inject(:+)/@houses.size
。
顺便说一句,我曾以为这种技术将变得更慢,因为它必须循环两次,但由于在Ruby中本身的优化,它实际上是更快了一对夫妇在我的关于Ruby 1.8.7测试万件,更快(在Ruby 1.9的,但多达不是),甚至近10万件。去告诉你分析的重要性。
如果您在Rails应用程序的时候,你可以做array.sum / array.size
不隶属于 StackOverflow