Ruby的each_with_index偏移量

我可以在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的枚举类。

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

产量

 1: foo 2: bar 3: baz 

Array#每个都返回一个枚举器,并调用Enumerator#with_index返回另一个枚举器,一个块传递给它。

1)最简单的方法是用index+1而不是index来代替函数:

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

但可能这不是你想要的。

2)你可以做的下一件事是在块中定义一个不同的索引j ,并使用它来代替原始索引:

 some_array.each_with_index{|item, i| j = i + 1; some_func(item, j)} 

3)如果你想经常以这种方式使用索引,那么定义另一种方法:

 module Enumerable def each_with_index_from_one *args, &pr each_with_index(*args){|obj, i| pr.call(obj, i+1)} end end %w(one two three).each_with_index_from_one{|w, i| puts "#{i}. #{w}"} # => 1. one 2. two 3. three 

更新

几年前回答的这个答案现在已经过时了。 对于现代的ruby来说,Zack Xu的答案会更好。

如果some_index有意义,那么可以考虑使用散列,而不是数组。

我碰到了它。

我不需要的解决scheme是最好的,但它只是为我工作。

在视图迭代中:

只需添加: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 

这是一个小黑客

UPD 2

至于你更新你的问题,现在你不需要数组偏移量,但索引偏移量,所以@sawa解决scheme将正常工作

Ariel是对的。 这是处理这个问题的最好方法,并不是那么糟糕

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

这是完全可以接受的,比我见过的大多数解决scheme都要好。 我一直认为这是#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) } 

这在每个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 
 offset = 2 some_array[offset..-1].each_with_index{|item, index| some_func(item, index+offset) }