红宝石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 \的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返回另一个枚举数,将一个块传递给该枚举数。     
1)最简单的方法是将
index+1
替换为ѭ7function:
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
更新资料 几年前回答的这个答案现在已经过时了。对于现代红宝石,Zack Xu的答案会更好。     
如果ѭ12在某种意义上有意义,则考虑使用哈希而不是数组。     
我碰到了。 我的解决方案不一定是最好的,但是对我来说却是有效的。 在视图迭代中: 只需添加:索引+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 我还要注意,如果offset大于您的Array大小,它将出现错误。因为:
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解决方案将对您有效     
Ariel是对的。这是处理此问题的最佳方法,而且还不错
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) }
    
这适用于每个红宝石版本:
%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) }
    

要回复问题请先登录注册