迭代枚举器的一部分(外部迭代器)?

时间:2012-06-08 07:07:43

标签: ruby enumerator

如果我想要数组的一部分,我可以使用[]split

arr = [1,2,3,4,5]
arr[1..3]
=> [2, 3, 4]

但是[]是否有“通用”版本?我可以将它应用于任何Enumerator吗?

enum = arr.each
enum.xxx_method(1..3) # is equal to arr[1..3].each

当然,您可以直接使用arr[1..3]。但我正在寻找一种处理任何调查员的一般方法。

1 个答案:

答案 0 :(得分:3)

如果你有一个枚举器,你可以依靠可枚举的方法droptake

# abstract if necessary as enum_slice(range)
enumerator.drop(2).take(3)

如果该枚举器是一个数组,您不需要遍历它,请检查与I asked to be added相关的enumerable_lazyyour previous question的方法Array#lazy_slice

require 'enumerable/lazy'

class Array
  def lazy_slice(range)
    Enumerator.new do |yielder|
      range.each do |index|
        yielder << self[index]
      end
    end.lazy
  end
end

some_big_array = (0..10000).to_a # fake array, it won't generally be a range
p some_big_array.lazy_slice(9995..10000).map { |x| 2*x }.to_a
#=> [19990, 19992, 19994, 19996, 19998, 20000]