web-dev-qa-db-ja.com

Ruby each_with_index offset

Each_with_indexループイテレーターでインデックスのオフセットを定義できますか?私のまっすぐな試みは失敗しました:

some_array.each_with_index{|item, index = 1| some_func(item, index) }

編集:

明確化:配列のオフセットが必要ないeach_with_index内のインデックスが0からではなく、たとえば1。

81
Mark

実際、 Enumerator#with_index は、オプションのパラメーターとしてオフセットを受け取ります。

[:foo, :bar, :baz].to_enum.with_index(1).each do |elem, i|
  puts "#{i}: #{elem}"
end

出力:

1: foo
2: bar
3: baz

ところで、私はそれが1.9.2にのみあると思います。

107

以下は、RubyのEnumeratorクラスを使用した簡潔なものです。

[:foo, :bar, :baz].each.with_index(1) do |elem, i|
    puts "#{i}: #{elem}"
end

出力

1: foo
2: bar
3: baz

Array#eachは列挙子を返し、Enumerator#with_indexを呼び出すと、ブロックが渡される別の列挙子を返します。

47
Zack Xu

some_indexは何らかの意味があるので、配列ではなくハッシュの使用を検討してください。

4
Andrew Grimm

私はそれに出くわしました。

必要ではない私の解決策は最高ですが、それはちょうど私のために働いた。

ビューの反復:

追加するだけ:index + 1

私はこれらのインデックス番号への参照を使用せず、リストに表示するためだけに使用するので、私にとってはすべてです。

4

はい、できます

some_array[offset..-1].each_with_index{|item, index| some_func(item, index) }
some_array[offset..-1].each_with_index{|item, index| some_func(item, index+offset) }
some_array[offset..-1].each_with_index{|item, index| index+=offset; some_func(item, index) }

[〜#〜] upd [〜#〜]

また、オフセットが配列サイズよりも大きい場合はエラーになります。なぜなら:

some_array[1000,-1] => nil
nil.each_with_index => Error 'undefined method `each_with_index' for nil:NilClass'

ここでできること:

 (some_array[offset..-1]||[]).each_with_index{|item, index| some_func(item, index) }

または、オフセットを事前検証するには:

 offset = 1000
 some_array[offset..-1].each_with_index{|item, index| some_func(item, index) } if offset <= some_array.size

これは少しハッキーです

PD 2

質問を更新し、配列オフセットは必要ありませんが、インデックスオフセットが必要なため、@ sawaソリューションは正常に機能します

3
fl00r

これはRubyバージョン:

%W(one two three).Zip(1..3).each do |value, index|
  puts value, index
end

そして、汎用配列の場合:

a.Zip(1..a.length.each do |value, index|
  puts value, index
end
1
fotanus

アリエルは正しい。これはこれを処理する最良の方法であり、それほど悪くはありません

ary.each_with_index do |a, i|
  puts i + 1
  #other code
end

これは完全に受け入れられ、私がこれまで見てきたほとんどのソリューションよりも優れています。私はいつもこれが#injectの目的だと思っていました...まあ。

1
boulder_ruby

別のアプローチは、mapを使用することです

some_array = [:foo, :bar, :baz]
some_array_plus_offset_index = some_array.each_with_index.map {|item, i| [item, i + 1]}
some_array_plus_offset_index.each{|item, offset_index| some_func(item, offset_index) }
1
Andrew Grimm
offset = 2
some_array[offset..-1].each_with_index{|item, index| some_func(item, index+offset) }
0
ipsum