如果我想要一个数组的一部分,我可以使用[]
or 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]
直接使用。但我正在寻找一种处理任何枚举器的通用方法。
如果我想要一个数组的一部分,我可以使用[]
or 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]
直接使用。但我正在寻找一种处理任何枚举器的通用方法。
如果你有一个枚举器,你可以指望 Enumerable 方法drop
和take
:
# abstract if necessary as enum_slice(range)
enumerator.drop(2).take(3)
如果该枚举器是您不需要遍历它的数组,请检查Array#lazy_slice
我要求添加到与您之前的问题相关的enumerable_lazy的方法:
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]