Kurzusok
/
Crystal
Crystal
/
Feladatok
/
Kastélyvacsora
Kastélyvacsora

Kastélyvacsora

Tanulófeladat

Bevezetés

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.

Hamis érték

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 nil ellenőrzése

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 vagy operátor

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"

Utasítások

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.

1. Ellenőrizd, hogy megfelelő-e az étel

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

2. Ellenőrizd, hogy mérgezett-e az ital

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

3. Cseréld ki az italt

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"
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Crystal Exercism

Készen állsz elkezdeni a(z) Kastélyvacsora feladatot?

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.