A ciklus egy vezérlési szerkezet, amellyel a kód egy adott feltétel alapján ismételten végrehajtható.
A while-ciklus egy vezérlési szerkezet, amellyel a kód egy adott feltétel alapján ismételten végrehajtható. A while-cikluson belüli kód addig hajtódik végre, amíg a feltétel igazra értékelődik. A while-ciklusokat gyakran akkor használjuk, amikor előre nem ismert az iterációk száma, de bármilyen helyzetben használhatók, ahol ciklusra van szükség.
A feltétel a cikluson belüli kód végrehajtása előtt értékelődik ki, ami azt jelenti, hogy ha a feltétel hamis, a cikluson belüli kód soha nem hajtódik végre.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Ha egy stringen szeretnél iterálni, végigmehetsz a string hosszán.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
Az until-ciklusok ugyanúgy működnek, mint a while-ciklusok, azzal a különbséggel, hogy a cikluson belüli kód addig hajtódik végre, amíg a feltétel igazra nem értékelődik.
Ez ugyanaz, mint az if és az unless közötti különbség.
i = 0
until i == 3
puts i
i += 1
end
A while-ciklusokkal gyakori hiba, hogy végtelen ciklusba kerülünk, amely soha nem ér véget. Egy végtelen ciklust okozhat, ha egy feltétel soha nem értékelődik igazra vagy hamisra. Ez gyakran programozói hiba; például elfelejtjük léptetni a ciklusváltozót. Néha azonban a végtelen ciklus a legvilágosabb módja a program logikájának megvalósítására. Vagy létfontosságú a végtelen ismétlés; például egy HTTP-szerver vár egy bejövő kapcsolatra, kezeli azt, majd a következő kapcsolatra vár.
A break kulcsszóval idő előtt kiléphetsz egy ciklusból.
Ez kényelmes lehet, ha bizonyos feltételek mellett szeretnél idő előtt kilépni egy ciklusból.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
A next kulcsszóval átugorhatsz egy ciklus következő iterációjára.
Ez kényelmes lehet, ha egy ciklus bizonyos iterációit szeretnéd kihagyni.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
A változó típusa a ciklus közben eltérő lehet.
A következő példában az a típusa Int32 | String, mert a ciklus első részében Int32 vagy String lehet.
Az a változó csak a ciklus első részében hordozza az Int32 | String típust, mivel amikor a ciklus elindul, Int32 értéket tartalmaz, a második iterációban pedig String értéket.
Ezt a többtípusos rendszert később részletesen elmagyarázzuk.
De mivel biztosak vagyunk benne, hogy a ciklus második része csak String értéket tartalmaz majd, az a típusa a ciklus második részében String.
Futásidőben soha nem tartalmaz egyszerre Int32 és String értéket.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
A while kifejezésként is használható, ami azt jelenti, hogy egy változó értékeként is szerepelhet.
A visszaadott érték a break kulcsszóval megadott érték.
Nem a ciklus utolsó kifejezésének értékét adja vissza.
a = while true
break 1
end
p a
# => 1
i = 0
a = while i == 0
i += 1
1
end
p a
# => nil