假设阵列被设置如下的@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千万的项目。 去告诉你分析的重要性。
如果你在一个Rails应用程序的时候,你可以做array.sum / array.size