我可以在each_with_index循环迭代器中定义索引的偏移量吗?我的直接尝试失败了:
some_array.each_with_index{|item, index = 1| some_func(item, index) }
编辑:
澄清:我不需要数组偏移量,我希望each_with_index中的索引不是从0开始,而是例如1。
Answers:
实际上,Enumerator#with_index
接收offset作为可选参数:
[: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中存在。
with_index
没有参数,来自0
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
几年前回答的这个答案现在已经过时了。对于现代红宝石,Zack Xu的答案会更好。
+1
我的代码中的更改为+2
或+10
。它的作品也是如此。
我碰到了。
我的解决方案不一定是最好的,但是它对我来说才有效。
在视图迭代中:
只需添加:索引+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解决方案对您来说很好