Each_with_indexループイテレーターでインデックスのオフセットを定義できますか?私のまっすぐな試みは失敗しました:
some_array.each_with_index{|item, index = 1| some_func(item, index) }
編集:
明確化:配列のオフセットが必要ないeach_with_index内のインデックスが0からではなく、たとえば1。
実際、 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にのみあると思います。
以下は、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を呼び出すと、ブロックが渡される別の列挙子を返します。
some_index
は何らかの意味があるので、配列ではなくハッシュの使用を検討してください。
私はそれに出くわしました。
必要ではない私の解決策は最高ですが、それはちょうど私のために働いた。
ビューの反復:
追加するだけ:index + 1
私はこれらのインデックス番号への参照を使用せず、リストに表示するためだけに使用するので、私にとってはすべてです。
はい、できます
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ソリューションは正常に機能します
これは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
アリエルは正しい。これはこれを処理する最良の方法であり、それほど悪くはありません
ary.each_with_index do |a, i|
puts i + 1
#other code
end
これは完全に受け入れられ、私がこれまで見てきたほとんどのソリューションよりも優れています。私はいつもこれが#injectの目的だと思っていました...まあ。
別のアプローチは、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) }
offset = 2
some_array[offset..-1].each_with_index{|item, index| some_func(item, index+offset) }