M. *_*osi 4 ruby arrays average
假设@houses数组设置如下:
house1.price = 10
house2.price = 20
house3.price = 30
@houses << house1
@houses << house2
@houses << house3
Run Code Online (Sandbox Code Playgroud)
这是我们计算的起点,我们想找到房子的平均价格:
total = 0
average = 0
for h in @houses
total += h.price
end
average = total/@houses.size
Run Code Online (Sandbox Code Playgroud)
这似乎是为了获得平均而非常多的打字.
有没有更好的办法?
mad*_*lep 14
inject在可枚举集合上使用该方法.Inject允许您传入'accumulator'的初始值(在本例中为0),然后对列表中的每个元素应用一些操作,并为累加器返回一个新值以传递给下一次迭代.
然后从inject调用返回累加器的最终值.
所以在这种情况下,我们只是将所有房价加到累加器中,然后最后除以总数.
您可以使用一些Ruby技巧来获得更多的功能,并且可能会将其压缩得更多,但这是可以理解的,并且只能在列表中迭代一次以添加值.
@houses.inject(0){|total, house| total + house.price} / @houses.size
Run Code Online (Sandbox Code Playgroud)
Chu*_*uck 11
Madlep的答案将适用于过去几年中任何版本的Ruby.但是,如果您使用的是Ruby 1.8.7或更高版本,则可以更简洁地表达它@houses.collect(&:price).inject(:+)/@houses.size.
顺便说一句,我曾经假设这种技术会慢一些,因为它必须循环两次,但是由于Ruby本身的优化,实际上我在Ruby 1.8.7的测试中的速度高达几百万,而且速度更快(但不是尽管如此,Ruby 1.9中甚至超过1000万件.向您展示分析的重要性.