Ruby评估循环枚举集合的次数是多少次?

时间:2010-11-09 02:47:10

标签: ruby

在Ruby中,如果我要循环一个集合,Ruby会评估枚举集合多少次?

具体来说,我想对一个集合进行排序,并循环遍历已排序的集合。由于我不需要保留已排序集合的副本,我想我只是将循环编写为:

for item in @items.sort{ |a,b| b.created_at <=> a.created_at } do
    #do some stuff
end

然而,在制作了那些可爱的代码之后,我开始怀疑有多少次我实际上会调用sort。

上述行确实只对集合进行一次排序吗?或者Ruby会为集合中的每个项目排序N次吗?

3 个答案:

答案 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,因为它每个项目只评估一次排序键功能。它可以让你写出一半的比较代码!