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) }