假设@house数组设置如下:
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这似乎是相当多的打字,只是为了得到一个平均值。
有没有更好的方法?
发布于 2009-07-23 01:31:45
在可枚举集合上使用inject方法。Inject允许您传递“累加器”的初始值(在本例中为0),然后对列表中的每个元素应用一些操作,并为要传递到下一次迭代的累加器返回一个新值。
然后从inject调用返回累加器的最终值。
因此,在这种情况下,我们只需将所有房价相加到累加器中,最后除以总数。
你可以变得更时髦,也许用一些Ruby技巧把它压缩得更短,但这是可以理解的,只需要迭代一次列表就可以将值相加。
@houses.inject(0){|total, house| total + house.price} / @houses.size发布于 2009-07-23 01:31:55
Madlep的回答适用于过去几年的任何版本的Ruby。但如果您使用的是Ruby1.8.7或更高版本,则可以更简洁地将其表示为@houses.collect(&:price).inject(:+)/@houses.size。
顺便说一句,我认为这种技术会更慢,因为它必须循环两次,但由于Ruby本身的优化,实际上在Ruby 1.8.7上的测试中,它的速度要快得多,在Ruby 1.8.7上的测试中,它可以快到几百万个项目,在Ruby 1.9上,甚至超过1000万个项目,它的速度也要快(但不是那么多)。向您展示了分析的重要性。
发布于 2009-08-16 05:52:58
如果您使用的是Rails应用程序,则可以执行array.sum/array.size
https://stackoverflow.com/questions/1169099
复制相似问题