如何在Ruby中块化数组

Chr*_*ton 60 ruby arrays

在Ruby 1.8.6中,我有一个数组,比如100,000个用户id,每个用户id都是一个int.我想在这些用户ID上执行一段代码,但我想以块的形式执行.例如,我想一次处理100个.我怎样才能尽可能简单地实现这一目标?

我可以做类似下面的事情,但可能有一个更简单的方法:

a = Array.new
userids.each { |userid|
  a << userid
  if a.length == 100
    # Process chunk
    a = Array.new
  end
}
unless a.empty?
  # Process chunk
end
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 114

用途each_slice:

require 'enumerator'
userids.each_slice(100) do |a|
  # do something with a
end
Run Code Online (Sandbox Code Playgroud)

  • 是的,您必须在1.8.6中要求"枚举器"才能使用(这就是我做的原因).在1.8.7+枚举器已被移动到核心,你不再需要它.但是,这样做不会导致错误,只是返回false.因此,出于兼容性原因,在使用枚举器中的方法时应始终要求"枚举器",以便代码可以与所有版本的ruby一起使用. (4认同)
  • 请注意,您实际上必须明确地"要求'枚举器'"才能使其工作:该方法在Enumerable中混合的类中不可用,这最初让我认为这个答案是错误的.然后我学得更好. (3认同)
  • @andorov对.任何大于1.8.6的Ruby版本都不需要它(如我之前的评论所述). (2认同)

wom*_*ton 26

Rails有in_groups_of,引擎盖下使用each_slice.

userids.in_groups_of(100){|group|
  //process group
}
Run Code Online (Sandbox Code Playgroud)

  • 我们不使用Rails.它对我们来说规模不够大; 我们的数据库分为大约26个分片.另外,我们有大量其他数据库服务器,可能还有20个左右,尽管这些服务器没有分片.谢谢你的建议,但我相信这对其他很多人都有用. (3认同)
  • 是的,知道您没有使用 Rails,这就是为什么我链接到源代码,这样您就可以在需要时提取该方法。 (2认同)