Se puede ampliar fácilmente la clase Range, en particular, la cada método, para que sea compatible con tanto ascendente como descendente rangos:
class Range
def each
if self.first < self.last
self.to_s=~(/\.\.\./) ? last = self.last-1 : last = self.last
self.first.upto(last) { |i| yield i}
else
self.to_s=~(/\.\.\./) ? last = self.last+1 : last = self.last
self.first.downto(last) { |i| yield i }
end
end
end
A continuación, el siguiente código llevará a cabo del mismo modo que había esperar:
(0..10).each { |i| puts i}
(0...10).each { |i| puts i}
(10..0).each { |i| puts i}
(10...0).each { |i| puts i}
Muy bien, gracias Derek! – larryzhao
Y en las versiones modernas de Ruby, puede hacer 'x = 5.downto (1)' y pasar 'x' alrededor como una variable. –
Agradable. un rango maneja un bloque como un iterador automáticamente. No es necesario llamar explícitamente a '.each' – ahnbizcad