2013-10-13 37 views

回答

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

请注意,您必须小心,因为数组,出于效率的原因,重载一些枚举方法,而不使用each

我和我以前的老板一起在一个大项目中使用了它,在我离开之前加入它。男孩,我很高兴离开那里。

编辑:刚刚发生,我认为我可以在上面提到的项目改善了这一点:

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

很好的解释.. –

+1

我有一个字与@Arup。他现在熟悉“代码炸弹”这个词。 –