A Crystalben létezik egy Nil nevű típus, amelynek csak egyetlen értéke lehet: nil.
Arra való, hogy egy érték hiányát jelezze, és hasonló a más nyelvekbeli null-hoz vagy None-hoz.
A nil értéket több metódus is visszaadhatja, például a String#[]?, amely nil-t ad vissza, ha az index kívül esik a tartományon.
"foo"[10]? # => nil
A Crystalben léteznek az úgynevezett null referencia ellenőrzések, ami azt jelenti, hogy alapértelmezés szerint egyetlen típus sem fogadhat el nil értéket.
Ez azt jelenti, hogy nem rendelhetsz nil-t egy változóhoz, hacsak kifejezetten nem Nil típusúként deklarálod.
Ez pedig azt jelenti, hogy a fordító automatikusan ellenőrzi a null referenciákat.
A nil értékek kezelésére többféle megközelítés kínálkozik.
A nil hamis értékű érték, akárcsak a false.
Ez azt jelenti, hogy az utasításokban és minden más helyen, ahol hamis vagy igaz értéket várunk, ugyanúgy kezelik, mint a false-t.
if nil
puts "nil is truthy"
else
puts "nil is falsey"
end
# => nil is falsey
Ez azt jelenti, hogy ha egy nil-képes változó értéke nil, akkor nem az igaz ág fut le.
foo = "boo"[2]? # It is possible that foo is nil
if foo
p foo.class # => Char
end
A Crystalben van egy metódus, amellyel ellenőrizheted, hogy egy érték nil-e.
A neve nil?, és minden objektumon elérhető.
foo = "boo"[2]?
if foo.nil?
puts "foo is nil"
else
puts "foo is not nil"
end
Ez kicsit másképp működik, ha csupán egy elágazásban használod az értéket, mivel az előző példákban a hamis és a nil is hamisként viselkedne.
Itt viszont csak a nil számít hamisnak, ugyanis ha az érték hamis lett volna, akkor nem nil lett volna, és így igaz értékű lett volna.
A nil értékek kezelésének legegyszerűbb módja, ha eleve megakadályozod, hogy egyáltalán nil legyen belőlük.
A vagy operátort (||) gyakran Bools értékeknél használjuk, de ha jól értjük, a nil értékek kezelésére is beválik.
A vagy operátor megnézi, hogy az első érték igaz-e; ha nem, akkor a második értéket használja.
Ez arra használható, hogy ha egy érték nil, akkor hamisnak számítson, és így a második értéket kapjuk.
"foo"[10]? || "bar" # => "bar"
Felséged vacsorát ad a Kalmari unió fővárosában, Koppenhágában. Ez az év legnagyobb ünnepsége, és minden nemes meghívást kapott. Az országban azonban egyre terjed a hír, hogy összeesküvést szőnek Felséged megmérgezésére.
Felséged téged, a királyi méregkeresőt kért meg arra, hogy derítsd ki, mérgezett-e bármelyik étel vagy ital. Felséged ételként csak a Mushroom pasties nevű fogást szándékozik felszolgálni, italból viszont többfélét kínál.
Nagy az esélye, hogy az étel mérgezett, ha nem az, amit Felséged rendelt. Ha az étel nem az, amit Felséged rendelt, ki kell dobni.
Valósítsd meg a check_food? metódust, amely egy food argumentumot vár, ami az étel nevét tartalmazza String-ként.
A metódus adja vissza az ételt, ha az Mushroom pasties, egyébként pedig adjon vissza nil-t.
CastleDinner.check_food?("Mushroom pasties")
# => "Mushroom pasties"
CastleDinner.check_food?("Bread")
# => nil
Lehetséges, hogy az ital mérgezett, de ezt valamivel nehezebb megállapítani.
Az ital akkor mérgezett, ha a nevében nem szerepel az i betű; a kis- és nagybetű nem számít.
Ha az ital mérgezett, ki kell dobni.
Valósítsd meg a check_drink? metódust, amely egy drink argumentumot vár, ami az ital nevét tartalmazza String-ként.
A metódus adja vissza az italt, ha az nem mérgezett, egyébként pedig adjon vissza nil-t.
CastleDinner.check_drink?("Apple juice")
# => "Apple juice"
CastleDinner.check_drink?("Tea")
# => nil
Felséged nem szeretné, hogy a vendégei az ételükben lévő méreg miatt aggódjanak. Ezért ha az ital mérgezett, le kell cserélni egy új italra, mégpedig Apple juice-ra.
Valósítsd meg a replace_drink metódust, amely egy drink argumentumot vár, ami az ital nevét tartalmazza String-ként.
A metódus adja vissza az italt, ha az nem mérgezett, egyébként pedig adjon vissza "Apple juice"-t.
CastleDinner.replace_drink("Orange juice")
# => "Orange juice"
CastleDinner.replace_drink("Tea")
# => "Apple juice"
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.