1

配列の一部が必要な場合は、[]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]直接使用することもできます。しかし、列挙子を処理する一般的な方法を探しています。

4

1 に答える 1

3

列挙子がある場合は、列挙可能なメソッドdroptake:

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

その列挙子が配列であり、それをトラバースする必要がない場合は、前の質問に関連してenumerable_lazyに追加するように依頼したメソッド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]
于 2012-06-08T07:39:56.803 に答える