For tsikl — to’plam elementlari bo’ylab yurish uchun ishlatiladigan sikl. Ruby’da klassik for mavjud, lekin amaliyotda undan ko’ra each metodi ustunlik qiladi — buning aniq texnik sababi bor.
for / each —
for x in to'plam ... end— to’plam elementlari bo’ylab yuradi.to'plam.each do |x| ... end— xuddi shu vazifani bajaradi, lekin blok o’ziga xos lokal doiraga (scope) ega.
Klassik for sikli
for sintaksisi boshqa tillarga o’xshab tanish ko’rinadi:
for son in 1..5
puts son
end
puts son
1
2
3
4
5
5
Diqqat qiling: sikl tugagach ham son o’zgaruvchisi hali mavjud va oxirgi qiymatni (5) saqlab qolgan. Sababi — for o’z lokal doirasini yaratmaydi, son sikldan tashqarida ham ko’rinadigan bo’lib qoladi.
each — Ruby uslubidagi muqobil
each xuddi shu natijani beradi, lekin blok parametri faqat blok ichida mavjud bo’ladi:
(1..5).each do |son|
puts son
end
puts defined?(son)
1
2
3
4
5
son bu safar faqat blok ichida yashaydi — blokdan tashqarida defined?(son) nil qaytaradi (bo’sh qator sifatida chop etiladi), chunki bunday o’zgaruvchi tashqarida umuman mavjud emas. Aynan shu — nomlar tasodifan tashqi kodga “sizib chiqmasligi” — sabab Ruby jamoasi for o’rniga eachni tavsiya qiladi.
times, upto, downto
Ma’lum sonda takrorlash uchun maxsus, o’qilishi oson metodlar bor:
3.times { |i| print i, " " }
puts
1.upto(4) { |i| print i, " " }
puts
5.downto(2) { |i| print i, " " }
puts
0 1 2
1 2 3 4
5 4 3 2
times — nol(0)dan boshlab, ko’rsatilgan sonchagacha (uni qamramay) takrorlaydi. upto/downto esa boshlang’ich sondan berilgan chegaragacha mos yo’nalishda sanaydi.
step — qadam bilan yurish
Bir xil oraliqda emas, muayyan qadam bilan sanash kerak bo’lganda step ishlatiladi:
1.step(10, 3) { |son| print son, " " }
puts
1 4 7 10
step(10, 3) — 1dan boshlab, har safar 3 qo’shib, 10dan oshmaguncha davom etadi. Bu, masalan, sahifalash (pagination) yoki har n-chi elementni tanlashda foydali.