A ciklus olyan vezérlési szerkezet, amely lehetővé teszi, hogy a kód egy adott feltétel alapján ismételten lefusson.
A while-ciklus olyan vezérlési szerkezet, amely lehetővé teszi, hogy a kód egy adott feltétel alapján ismételten lefusson. A while-cikluson belüli kód mindaddig fut, amíg a feltétel igaz értéket ad. A while-ciklusokat gyakran akkor használjuk, amikor előre nem ismert az iterációk száma, de bármilyen helyzetben bevethetők, ahol ciklusra van szükség.
A feltétel kiértékelése a cikluson belüli kód végrehajtása előtt történik, ami azt jelenti, hogy ha a feltétel hamis, a cikluson belüli kód soha nem fut le.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Ha egy string fölött szeretnél iterálni, a string hosszán is végigmehetsz ciklussal.
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 fut, amíg a feltétel igaz nem lesz.
Ez ugyanaz a különbség, mint az if és az unless között.
i = 0
until i == 3
puts i
i += 1
end
A while-ciklusok gyakori hibája a „végtelen ciklus”, amelyből soha nem lép ki a program. Egy végtelen ciklust okozhat, ha egy feltétel soha nem értékelődik igazra vagy hamisra. Ez gyakran programozói hiba következménye; például elfelejtjük léptetni a ciklusváltozót. De néha épp a végtelen ciklus a legvilágosabb módja annak, hogy megvalósítsuk a program logikáját. Vagy épp létfontosságú a végtelen ismétlés; például egy HTTP-szerver megvárja a bejövő kapcsolatot, kiszolgálja, majd a következő kapcsolatra vár.
A break kulcsszót arra használhatod, hogy idő előtt kilépj egy ciklusból.
Ez kényelmes lehet, ha bizonyos feltételek teljesülése esetén idő előtt szeretnél kilépni a ciklusból.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
A next kulcsszóval a ciklus következő iterációjára ugorhatsz.
Ez kényelmes lehet, ha a ciklus bizonyos iterációit ki szeretnéd hagyni.
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 során megváltozhat.
A következő példában az a típusa Int32 | String, mert a ciklus első részében Int32 vagy String is lehet.
Az a változó csak a ciklus első részében viseli az Int32 | String típust, mivel a ciklus indulásakor Int32-t tartalmaz, a második iterációban pedig String-et.
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-et tartalmaz majd, az a típusa a ciklus második részében String.
Futásidőben soha nem tartalmaz egyszerre Int32-t és String-et.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
A Crystalben egy metódus utolsó kifejezése adja vissza az értékét.
Néha azonban az utolsó kifejezés előtt kell visszaadnod egy értéket.
Erre a return kulcsszót használhatod, amely a mögötte álló kifejezés értékét adja vissza.
A return kulcsszó után írt kód nem fut le.
def speed_limit(road_number)
if road_number == 1
return 50
puts "This will not be executed"
elsif road_number == 2
return 80
puts "This will not be executed"
end
100
end
p speed_limit(1) # => 50
p speed_limit(2) # => 80
p speed_limit(3) # => 100
A return kulcsszót el kell hagyni, ha egy metódus utolsó kifejezése épp az az érték, amelyet vissza kell adni.
Ebben a feladatban megtakarítási számlákkal fogsz dolgozni. A megtakarítási számlád egyenlege minden évben a kamatlába alapján frissül. A bank által adott kamatláb a számládon lévő pénz összegétől (az egyenlegtől) függ:
1000 dollárnál kisebb pozitív egyenleg esetén.1000 dollárnál nagyobb vagy azzal egyenlő, és 5000 dollárnál kisebb pozitív egyenleg esetén.5000 dollárnál nagyobb vagy azzal egyenlő pozitív egyenleg esetén.Négy részfeladat vár rád, mindegyik az egyenlegeddel és annak kamatlábával foglalkozik.
Valósítsd meg a SavingsAccount.interest_rate() metódust, amely argumentumként egy egyenleget kap.
A metódus adja vissza a megadott egyenleghez tartozó kamatlábat.
SavingsAccount.interest_rate(200.75)
# => 0.5
Valósítsd meg a SavingsAccount.interest() metódust, amely argumentumként egy egyenleget kap.
A metódus adja vissza a megadott egyenleghez tartozó kamatot.
SavingsAccount.interest(200.75)
# => 1.00375
Valósítsd meg a SavingsAccount.annual_balance_update() metódust, amely argumentumként egy egyenleget kap.
A metódus adja vissza az egy év utáni egyenleget.
SavingsAccount.annual_balance_update(200.75)
# => 201.75375
Valósítsd meg a SavingsAccount.years_before_desired_balance() metódust, amely argumentumként egy egyenleget és egy cél-egyenleget kap.
A metódus adja vissza, hány évbe telne elérni a cél-egyenleget.
balance = 200.75
target_balance = 214.88
SavingsAccount.years_before_desired_balance(balance, target_balance)
# => 14
Amikor egyszerű kamatot számítunk egy tőkeegyenlegre, az egyenleget megszorozzuk a kamatlábbal, és a kettő szorzata adja a kamat összegét.
A kamatos kamat ezzel szemben rendszeres kamatozással működik. Minden egyes alkalmazáskor kiszámítjuk a kamat összegét, és hozzáadjuk a tőkeegyenleghez, így a későbbi kamatszámítások már nagyobb tőkeegyenlegre vonatkoznak.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Crystal nyelvet 26 fogalom142 feladat segítségével, valódi emberi mentorálással, mindez ingyen.