A Crystalben vannak úgynevezett vezérlő kifejezések. Ezekkel szabályozható, hogyan fut le a program, és igaz vagy hamis értéket vesznek fel. Vannak olyan operátorok, amelyekkel igaz vagy hamis értékeket hozhatsz létre, ezeket egyenlőség- és összehasonlító operátoroknak nevezzük.
Két fő vezérlő kifejezés dönti el, hogy melyik kód fut le és melyik nem, vagyis hogy melyik ág fut végre.
Ez a kettő az if és az unless kifejezés.
Az összehasonlító operátorok értékek összehasonlítására szolgálnak, és true vagy false értéket adnak vissza.
Ezek az operátorok két azonos típusú értéket várnak.
Ha az értékek típusa eltér, a fordító hibát dob.
Íme az összehasonlító operátorok listája, és egy-egy példa arra, mikor adnak true értéket:
| Metódus | Leírás | Példa |
|---|---|---|
| < | kisebb, mint | 4 < 5 |
| <= | kisebb vagy egyenlő | 4 <= 4 |
| > | nagyobb, mint | 3 > 1 |
| >= | nagyobb vagy egyenlő | 2 >= 2 |
Az egyenlőségoperátorok hasonlítanak az összehasonlító operátorokhoz, de arra valók, hogy eldöntsék, két érték egyenlő-e.
A == operátor azt vizsgálja, hogy két érték egyenlő-e, az érték típusát is beleértve.
Ha az értékek megegyeznek, true-t ad vissza, ellenkező esetben false-t.
A == operátor bármilyen típusú értéket össze tud hasonlítani bármilyen más típusú értékkel.
A != ugyanígy működik, de akkor ad true-t, ha az értékek nem egyenlők, és false-t, ha egyenlők.
if elágazásAz if elágazás azt vizsgálja, hogy egy adott feltétel igaz-e vagy hamis.
Ha a feltétel igaz, akkor lefut az elágazáson belüli kód.
Az if elágazást az end kulcsszó zárja le.
if 1 == 1
puts "1 is equal to 1"
end
# => 1 is equal to 1
if 1 > 2
puts "1 is greater than 2"
end
# => no output
unless elágazásAz unless elágazás nagyon hasonlóan működik az if elágazáshoz, de akkor futtatja az unless elágazáson belüli kódot, ha a feltétel hamis.
unless 1 == 1
puts "1 is not equal to 1"
end
# => no output
unless 1 > 2
puts "1 is not greater than 2"
end
# => 1 is not greater than 2
else ágAz else ág az if és az unless elágazással együtt használható.
Az else ág akkor fut le, ha az if ág vagy az unless ág nem fut le.
Bár egy `else` ág használható `unless,` mellett, ez nem ajánlott, mert rontja az olvashatóságot.
Helyette érdemesebb az `if !condition` szerkezetet használni `else` ággal.
if 1 == 1
puts "1 is equal to 1"
else
puts "1 is not equal to 1"
end
# => 1 is equal to 1
unless 1 < 2
puts "1 is not greater than 2"
else
puts "1 is greater than 2"
end
# => 1 is greater than 2
Az elsif ág az if elágazással együtt használható.
Az elsif ág akkor fut le, ha az if ág nem futott le, és az elsif feltétele igaz.
Az elsif ágak egymás után fűzhetők, és az első igaz feltételű ág fut le.
Az if elágazás végén lehet egy else ág is, amely akkor fut le, ha egyik korábbi ág feltétele sem volt igaz.
if 1 != 1
puts "1 is not equal to 1"
elsif 1 > 2
puts "1 is greater than 2"
else
puts "1 is not equal to 1 and 1 is not greater than 2"
end
# => 1 is not equal to 1 and 1 is not greater than 2
Ha a változó különböző ágakban különböző típusú értéket kap, mindkét típust felveszi. Ez azért van, mert a fordító nem tudja, melyik ág fut le. Ezt a többszörös értékadást, más néven uniót, a későbbi fogalmakban fejtjük ki. Az alábbi példán láthatod:
if 1 == 1
a = 1
else
a = "1"
end
typeof(a) # => Int32 | String
A Crystalben van ternáris operátor, egy egysoros if-else szerkezet: condition ? expression_if_truthy : expression_if_falsey
1 == 1 ? puts("1 is equal to 1") : puts("1 is not equal to 1")
# => 1 is equal to 1
Ebben a feladatban egy egyszerű vezérlőrendszert fejlesztünk egy atomreaktorhoz.
Ahhoz, hogy a reaktor energiát termeljen, kritikussági állapotban kell lennie. Ha a reaktor a kritikusságnál alacsonyabb állapotban van, akkor károsodhat. Ha a reaktor állapota túllépi a kritikusságot, akkor túlterhelődhet, és zónaolvadáshoz vezethet. Szeretnénk csökkenteni a zónaolvadás esélyét, és megfelelően kezelni a reaktor állapotát.
A következő három részfeladat mindegyike az ideális reaktorállapot fenntartásához szükséges kód megírásához kapcsolódik.
A vezérlőrendszer első dolga, hogy ellenőrizze, a reaktor kiegyensúlyozott-e a kritikusság szempontjából. A reaktor akkor tekinthető kritikusnak, ha teljesülnek a következő feltételek:
Valósítsd meg a Reactor.criticality_balanced? metódust, amely temperature (kelvinben mérve) és neutrons_emitted paramétereket vesz át, és true-t ad vissza, ha a kritikussági feltételek teljesülnek, false-t, ha nem.
Reactor.criticality_balanced?(750, 600)
# => true
Miután a reaktor elkezdett energiát termelni, meg kell határozni a hatásfokát. A hatásfok 4 sávba sorolható:
green -> 80%-os vagy annál nagyobb hatásfok,orange -> 80%-nál kisebb, de legalább 60%-os hatásfok,red -> 60%-nál kisebb, de még mindig legalább 30%-os hatásfok,black -> 30%-nál kisebb hatásfok.A százalékos érték a következőképpen számítható ki: (generated_power/theoretical_max_power)*100,
ahol generated_power = voltage * current.
Vedd figyelembe, hogy a százalékos érték általában nem egész szám, ezért ügyelj a < és <=
összehasonlítások helyes használatára.
Valósítsd meg a Reactor.reactor_efficiency metódust három paraméterrel: voltage, current és theoretical_max_power.
Ez a függvény a reaktor hatásfoksávját adja vissza: „green”, „orange”, „red” vagy „black”.
Reactor.reactor_efficiency(200,50,15000)
# => "orange"
Az utolsó részfeladatod egy hibabiztos mechanizmus létrehozása, amely elkerüli a túlterhelést és a zónaolvadást. Ez a mechanizmus meghatározza, hogy a reaktor az ideális kritikussági küszöb alatt, azzal egy szinten vagy felette van-e. A kritikusság ezután növelhető, csökkenthető vagy leállítható a szabályozórudak reaktorba történő behelyezésével (vagy eltávolításával).
Valósítsd meg a Reactor.fail_safe() metódust, amely 3 paramétert vesz át: temperature (kelvinben mérve), neutrons_produced_per_second és threshold, és egy állapotkódot ad ki a reaktorhoz.
Ha temperature * neutrons_produced_per_second < a threshold 90%-a, akkor add ki a „LOW” állapotkódot,
jelezve, hogy az energiatermeléshez el kell távolítani a szabályozórudakat.
Ha temperature * neutrons_produced_per_second a threshold plusz-mínusz 10%-án belül van,
a reaktor kritikus állapotban van, és a „NORMAL” állapotkódot kell kiadni, jelezve, hogy a
reaktor optimális állapotban van, és a szabályozórudak ideális helyzetben vannak.
Ha temperature * neutrons_produced_per_second nincs a fent említett tartományokban, a reaktor
zónaolvadásba kerül, és a „DANGER” állapotkódot kell kiadni, hogy azonnal leállítsák a reaktort.
temperature = 1000
neutrons_produced_per_second = 30
threshold = 5000
Reactor.fail_safe(temperature, neutrons_produced_per_second, threshold)
# => "DANGER"
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.