Ruby each_with_index偏移量

Mar*_*ark 82 ruby iteration

我可以在each_with_index循环迭代器中定义索引的偏移量吗?我的直接尝试失败了:

some_array.each_with_index{|item, index = 1| some_func(item, index) }
Run Code Online (Sandbox Code Playgroud)

编辑:

澄清:我不想要数组偏移我希望each_with_index中的索引不是从0开始,而是例如1.

Mla*_*vić 109

实际上,Enumerator#with_index接收offset作为可选参数:

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

输出:

1: foo
2: bar
3: baz
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我认为它只存在于1.9.2中.

  • 在1.8.7中它只有`with_index`没有参数,索引来自`0` (2认同)

Zac*_* Xu 47

以下是简洁的,使用Ruby的Enumerator类.

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

产量

1: foo
2: bar
3: baz
Run Code Online (Sandbox Code Playgroud)

Array#each返回一个枚举器,调用Enumerator#with_index返回另一个枚举器,传递一个块.


saw*_*awa 5

1)最简单的是取代index+1的,而不是index给该函数:

some_array.each_with_index{|item, index| some_func(item, index+1)}
Run Code Online (Sandbox Code Playgroud)

但可能这不是你想要的.

2)您可以做的下一件事是j在块中定义不同的索引并使用它而不是原始索引:

some_array.each_with_index{|item, i| j = i + 1; some_func(item, j)}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


更新

这个答案在几年前得到了回答,现在已经过时了.对于现代红宝石,Zack Xu的答案会更好.