2013-10-13 5 views

Répondre

10

Oui, c'est possible.

[1,2,3,4,5,6].reverse_each.each_cons(3) { |before, current, next_| 
    p [before, current, next_] 
} 

imprime

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

impressions

[nil, 6, 5] 
[6, 5, 4] 
[5, 4, 3] 
[4, 3, 2] 
[3, 2, 1] 
[2, 1, nil] 
2

Cela pourrait fonctionner pour vous:

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 

Notez que vous devez faire attention car Array, pour des raisons d'efficacité, surcharge certaines méthodes Enumerable sans utiliser each.

J'ai utilisé ce dans un grand projet avec mon employeur précédent, en ajoutant juste avant mon départ. Boy, étais-je heureux de sortir de là.

Edit: Il me est apparu juste que je aurais pu améliorer cela dans le projet cité ci-dessus:

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

bonne explication .. –

+1

j'ai eu un mot avec @Arup. Il connaît maintenant le terme «bombe à code». –