Bạn có thể dễ dàng mở rộng các lớp Range, đặc biệt là mỗi phương pháp, để làm cho nó tương thích với cả tăng dần và dao động giảm dần:
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
Sau đó, đoạn code sau sẽ thực hiện cũng giống như bạn muốn mong đợi:
(0..10).each { |i| puts i}
(0...10).each { |i| puts i}
(10..0).each { |i| puts i}
(10...0).each { |i| puts i}
Rất tốt, cảm ơn Derek! – larryzhao
Và trong các phiên bản hiện đại của Ruby, bạn có thể làm 'x = 5.downto (1)' và chuyển 'x' xung quanh thành một biến. –
Tốt. một dãy xử lý một khối như một trình lặp tự động một cách tự động. Không cần gọi rõ ràng '.each' – ahnbizcad