配列の一部を繰り返し処理したい。たとえば、最初の要素を除くすべての要素を出力しようとします。
array[1..-1].each {|e| puts e}
しかしarray[1..-1]
、新しいArray
. 大きすぎるともったいないarray
。別の簡単なアプローチ:
(1...array.size).each { |i| puts array[i] }
できます。しかし、もっとエレガントなトリックがあるのではないかと思います。
Ruby 2.0 はLazy enumerableを出荷します (すばらしいニュースです!)。今のところ、enumerable-lazy のような gem を使用してエンジンをウォームアップできます。
require 'enumerable/lazy'
xs.lazy.drop(1).each { |x| puts x }
それは悪くありませんが、要素を破棄するためにトラバースする必要がある遅延オブジェクト (リンクされたリスト) ではなく、配列が既にあるため、概念的にはあなたのケースには正確には当てはまりません (わかりました、ここでは 1 つの要素を破棄しているだけです。それは契約を破るものではありません)。したがって、ソリューション (範囲を使用するソリューション) を、Enumerable#each_from(start_index)
あたかもそれを頻繁に使用する予定であるかのように抽象化することができます。
詳細: オブジェクトを返すenumerable-lazy の拡張機能を作成することもできます。それはまたかなりよく見えます:Array#lazy_slice(range)
Enumerable#lazy
xs.lazy_slice(1..-1).each { |x| puts x }
array.each_with_index {|x, i| puts x unless i.eql?0}