Tracks
/
Crystal
Crystal
/
Übungen
/
Dinner im Schloss
Dinner im Schloss

Dinner im Schloss

Lernübung

Einführung

Crystal hat einen Typ namens Nil, der nur einen einzigen Wert haben kann: nil. Er steht für das Fehlen eines Werts und ähnelt null oder None in anderen Sprachen.

Methoden können nil zurückgeben, zum Beispiel String#[]?. Diese Methode liefert nil, wenn der Index außerhalb des gültigen Bereichs liegt.

"foo"[10]? # => nil

Crystal hat, was man NULL-REFERENZPRÜFUNGEN nennt. Das bedeutet, dass alle Typen standardmäßig nicht nil-fähig sind. Du kannst einer Variable also kein nil zuweisen, es sei denn, du deklarierst sie ausdrücklich als Typ Nil. Das wiederum bedeutet, dass der Compiler automatisch auf Null-Referenzen prüft.

Falsey-Wert

Es gibt verschiedene Ansätze, um mit nil-Werten umzugehen. nil ist ein falsey-Wert, genau wie false. In Bedingungen und an anderen Stellen, an denen ein falsey- oder truthy-Wert erwartet wird, wird er also genauso behandelt wie false.

if nil
  puts "nil is truthy"
else
  puts "nil is falsey"
end

# => nil is falsey

Das bedeutet, dass der truthy-Zweig nicht ausgeführt wird, wenn eine nil-fähige Variable den Wert nil hat.

foo = "boo"[2]? # It is possible that foo is nil
if foo
  p foo.class # => Char
end

Auf nil prüfen

Crystal hat eine Methode, mit der du prüfen kannst, ob ein Wert nil ist. Sie heißt nil? und ist auf allen Objekten verfügbar.

foo = "boo"[2]?
if foo.nil?
  puts "foo is nil"
else
  puts "foo is not nil"
end

Etwas anders ist es, wenn du den Wert direkt in einer if-Anweisung verwendest. In den letzten Beispielen würden sowohl false als auch nil als falsch gelten. Hier wird nur nil als falsey behandelt. Wäre der Wert false, dann wäre er nicht nil gewesen und somit truthy.

Der or-Operator

Der einfachste Weg, mit nil-Werten umzugehen, ist sicherzustellen, dass sie gar nicht erst nil werden. Der or-Operator (||) wird oft im Umgang mit Bools verwendet, aber richtig verstanden hilft er auch bei nil-Werten. Der or-Operator prüft, ob der erste Wert truthy ist. Wenn nicht, wird der zweite Wert verwendet. Damit kannst du erreichen, dass der zweite Wert verwendet wird, wenn der erste nil und damit falsey ist.

"foo"[10]? || "bar" # => "bar"

Anleitung

Eure Majestät richtet in Kopenhagen, der Hauptstadt der Kalmarer Union, ein Abendessen aus. Es ist die größte Feier des Jahres und alle Adligen sind eingeladen. Doch im ganzen Land verbreiten sich Gerüchte, dass es eine Verschwörung gibt, Eure Majestät zu vergiften.

Ihre Majestät hat dich, den königlichen Giftfinder, gebeten, herauszufinden, ob Speisen oder Getränke vergiftet sind. Ihre Majestät plant, als Speise nur Mushroom pasties zu servieren, aber bei den Getränken gibt es eine große Auswahl.

1. Prüfe, ob die Speise richtig ist

Es ist sehr wahrscheinlich, dass die Speise vergiftet ist, wenn sie nicht die ist, die Ihre Majestät bestellt hat. Ist die Speise nicht die, die Ihre Majestät bestellt hat, sollte sie weggeworfen werden.

Implementiere die Methode check_food?, die das Argument food entgegennimmt, das den Namen der Speise als String enthält. Die Methode sollte die Speise zurückgeben, wenn sie Mushroom pasties ist; andernfalls sollte sie nil zurückgeben.

CastleDinner.check_food?("Mushroom pasties")
# => "Mushroom pasties"

CastleDinner.check_food?("Bread")
# => nil

2. Prüfe, ob das Getränk vergiftet ist

Es ist möglich, dass das Getränk vergiftet ist, aber es ist etwas schwieriger, das festzustellen. Das Getränk ist vergiftet, wenn der Name den Buchstaben i nicht enthält; die Groß- und Kleinschreibung spielt keine Rolle. Ist das Getränk vergiftet, sollte es weggeworfen werden.

Implementiere die Methode check_drink?, die das Argument drink entgegennimmt, das den Namen des Getränks als String enthält. Die Methode sollte das Getränk zurückgeben, wenn es nicht vergiftet ist, andernfalls sollte sie nil zurückgeben.

CastleDinner.check_drink?("Apple juice")
# => "Apple juice"

CastleDinner.check_drink?("Tea")
# => nil

3. Ersetze das Getränk

Eure Majestät möchte ihre Gäste schließlich nicht wegen Gift in ihrem Essen beunruhigen. Wenn das Getränk also vergiftet ist, sollte es durch ein neues Getränk ersetzt werden, und zwar durch Apple juice.

Implementiere die Methode replace_drink, die das Argument drink entgegennimmt, das den Namen des Getränks als String enthält. Die Methode sollte das Getränk zurückgeben, wenn es nicht vergiftet ist, andernfalls sollte sie "Apple juice" zurückgeben.

CastleDinner.replace_drink("Orange juice")
# => "Orange juice"

CastleDinner.replace_drink("Tea")
# => "Apple juice"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Crystal Exercism

Bereit, mit Dinner im Schloss zu starten?

Melde dich bei Exercism an, um Crystal mit 26 Konzepte142 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.