在Ruby中,如果我要循环一个集合,Ruby会评估枚举集合多少次?
具体来说,我想对一个集合进行排序,并循环遍历已排序的集合。由于我不需要保留已排序集合的副本,我想我只是将循环编写为:
for item in @items.sort{ |a,b| b.created_at <=> a.created_at } do
#do some stuff
end
然而,在制作了那些可爱的代码之后,我开始怀疑有多少次我实际上会调用sort。
上述行确实只对集合进行一次排序吗?或者Ruby会为集合中的每个项目排序N次吗?
答案 0 :(得分:1)
您正在拨打sort
一次。
除了范围差异外,
for x in xs do
some_stuff
end
与
相同xs.each do |x|
some_stuff
end
当然,当您执行foo.bar(baz)
时,foo
只会被评估一次,无论bar
是什么。
答案 1 :(得分:1)
这相当于整理整个集合一次,然后迭代一次。
相当于:
@items.sort{ |a,b| b.created_at <=> a.created_at }.each do |item|
# do some stuff
end
答案 2 :(得分:0)
更干净,更快:
@items.sort_by {|a| a.created_at}.reverse
如果可以(并且几乎总是可以),您应该总是使用sort_by
而不是sort
,因为它每个项目只评估一次排序键功能。它可以让你写出一半的比较代码!