如何使用当前元素的下一个和前一个元素反向迭代数组?
可以each_cons
用reverse_each
吗?
对的,这是可能的。
[1,2,3,4,5,6].reverse_each.each_cons(3) { |before, current, next_|
p [before, current, next_]
}
印刷
[6, 5, 4]
[5, 4, 3]
[4, 3, 2]
[3, 2, 1]
([nil]+[1,2,3,4,5,6]+[nil]).reverse_each.each_cons(3) { |before, current, next_|
p [before, current, next_]
}
印刷
[nil, 6, 5]
[6, 5, 4]
[5, 4, 3]
[4, 3, 2]
[3, 2, 1]
[2, 1, nil]
这可能对您有用:
class Array
alias :old_each :each
def each
reverse.old_each {|e| yield e}
end
end
a = [1,2,3]
a.each {|e| print "#{e} "} # => 3 2 1
请注意,您必须小心这一点,因为 Array 出于效率原因,重载了一些 Enumerable 方法而不使用each
.
我和我以前的雇主在一个大项目中使用了它,在我离开之前添加了它。男孩,我很高兴能离开那里。
编辑:我突然想到我可以在上面提到的项目中改进它:
def each
if rand(1000) == 500
reverse.old_each {|e| yield e}
else
old_each {|e| yield e}
end
end