19

我想reverse_each_with_index在数组上使用类似的东西。

例子:

array.reverse_each_with_index do |node,index|
  puts node
  puts index
end

我看到 Ruby 有,each_with_index但它似乎没有相反的东西。还有另一种方法可以做到这一点吗?

4

6 回答 6

53

如果你想要数组中元素的真实索引,你可以这样做

['Seriously', 'Chunky', 'Bacon'].to_enum.with_index.reverse_each do |word, index|
  puts "index #{index}: #{word}"
end

输出:

index 2: Bacon
index 1: Chunky
index 0: Seriously

您还可以定义自己的 reverse_each_with_index 方法

class Array
  def reverse_each_with_index &block
    to_enum.with_index.reverse_each &block
  end
end

['Seriously', 'Chunky', 'Bacon'].reverse_each_with_index do |word, index|
  puts "index #{index}: #{word}"
end

优化版本

class Array
  def reverse_each_with_index &block
    (0...length).reverse_each do |i|
      block.call self[i], i
    end
  end
end
于 2013-11-27T16:57:25.297 回答
20

首先reverse是数组,然后使用each_with_index

array.reverse.each_with_index do |element, index|
  # ...
end

虽然,索引将从0length - 1,而不是相反。

于 2013-04-01T05:54:12.780 回答
8

好吧,既然 Ruby 总是喜欢给你选择,你不仅可以:

arr.reverse.each_with_index do |e, i|

end

但你也可以这样做:

arr.reverse_each.with_index do |e, i|

end
于 2013-04-01T06:05:37.867 回答
6

不复制数组:

(array.size - 1).downto(0) do |index|
  node = array[index]
  # ...
end
于 2017-12-04T06:12:07.613 回答
2

简单地

arr.reverse.each_with_index do |node, index|
于 2013-04-01T05:55:09.630 回答
0

在我的用例中,我想使用负索引向后迭代

a = %w[a b c] 
(1..a.size).each {|i| puts "-#{i}: #{a[-i]}"}
# => -1: c
# => -2: b
# => -3: a
于 2021-01-03T15:42:41.850 回答