Ruby Array - 使用next和before元素进行反向迭代

时间:2013-10-13 06:48:03

标签: ruby arrays

如何使用当前元素的next和before元素反向迭代一个数组?

是否可以将each_consreverse_each一起使用?

2 个答案:

答案 0 :(得分:10)

是的,这是可能的。

[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]

答案 1 :(得分:2)

这可能对您有用:

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在不使用each的情况下重载了一些Enumerable方法。

我和我以前的雇主在一个大项目中使用过它,在我离开之前添加它。男孩,我很高兴离开那里。

编辑:我刚刚想到我可以在上面引用的项目中对此进行改进:

  def each
    if rand(1000) == 500
      reverse.old_each {|e| yield e}
    else
      old_each {|e| yield e}
    end
  end