2013-10-13 69 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。他現在熟悉「代碼炸彈」這個詞。 –