Parcours
/
Crystal
Crystal
/
Exercices
/
Dîner au château
Dîner au château

Dîner au château

Exercice d'apprentissage

Introduction

Crystal possède un type appelé Nil, qui ne peut avoir qu'une seule valeur : nil. Il sert à représenter l'absence de valeur et s'apparente à null ou None dans d'autres langages.

Des valeurs Nil peuvent être renvoyées par diverses méthodes, par exemple String#[]?, qui renvoie nil si l'indice est hors limites.

"foo"[10]? # => nil

Crystal dispose de ce que l'on appelle des VÉRIFICATIONS DE RÉFÉRENCE NULLE, ce qui signifie que par défaut, aucun type ne peut prendre la valeur nil. Autrement dit, tu ne peux pas affecter nil à une variable, sauf si tu la déclares explicitement comme étant de type Nil. Par conséquent, le compilateur vérifie automatiquement les références nulles.

Valeur fausse

On peut adopter différentes approches pour gérer les valeurs nil. nil est une valeur fausse, tout comme false. Cela signifie que dans les instructions et les autres endroits où une valeur fausse ou vraie est attendue, elle est traitée de la même façon que false.

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

# => nil is falsey

Autrement dit, la branche vraie ne sera pas empruntée si une variable pouvant valoir nil a pour valeur nil.

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

Vérifie si une valeur est nil

Crystal dispose d'une méthode qui permet de vérifier si une valeur est nil. Elle s'appelle nil? et elle est disponible sur tous les objets.

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

Le comportement est un peu différent quand on utilise simplement la valeur dans une instruction if, car dans les exemples précédents, false comme nil seraient traités comme faux. Ici, seul nil est traité comme une valeur fausse, car si c'était false, ce ne serait pas nil, et ce serait donc vrai.

L'opérateur OU

La façon la plus simple de gérer les valeurs nil est de faire en sorte qu'elles ne deviennent jamais nil dès le départ. L'opérateur ou (||) est souvent utilisé avec les Bools, mais si on le comprend bien, il peut aussi servir à gérer les valeurs nil. L'opérateur ou vérifie si la première valeur est vraie ; si ce n'est pas le cas, c'est la deuxième valeur qui est utilisée. Cela permet de faire en sorte que si la valeur est nil, elle soit considérée comme fausse et que la deuxième valeur soit utilisée à la place.

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

Instructions

Sa Majesté donne un dîner dans la capitale de l'union de Kalmar, Copenhague. C'est la plus grande fête de l'année et tous les nobles sont invités. Mais des rumeurs se répandent dans tout le pays : un complot viserait à empoisonner Sa Majesté.

Sa Majesté t'a chargé, toi le détective royal des poisons, de déterminer si un plat ou une boisson est empoisonné. Sa Majesté prévoit de ne servir qu'un seul plat, des Mushroom pasties, mais côté boissons, il y en a de toutes sortes.

1. Vérifie si le plat est correct

Il y a de fortes chances que le plat soit empoisonné s'il ne correspond pas à ce que Sa Majesté a commandé. Si le plat n'est pas ce que Sa Majesté a commandé, il faut le jeter.

Implémente la méthode check_food?, qui prend l'argument food contenant le nom du plat sous forme de String. La méthode doit renvoyer le plat s'il s'agit de Mushroom pasties ; sinon, elle doit renvoyer nil.

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

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

2. Vérifie si la boisson est empoisonnée

Il est possible que la boisson soit empoisonnée, mais c'est un peu plus difficile à déterminer. La boisson est empoisonnée si son nom ne contient pas la lettre i, peu importe la casse. Si la boisson est empoisonnée, il faut la jeter.

Implémente la méthode check_drink?, qui prend l'argument drink contenant le nom de la boisson sous forme de String. La méthode doit renvoyer la boisson si elle n'est pas empoisonnée, sinon elle doit renvoyer nil.

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

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

3. Remplace la boisson

Sa Majesté ne voudrait pas inquiéter ses invités à propos de poison dans leur nourriture. Par conséquent, si la boisson est empoisonnée, il faut la remplacer par une nouvelle boisson, à savoir Apple juice.

Implémente la méthode replace_drink, qui prend l'argument drink contenant le nom de la boisson sous forme de String. La méthode doit renvoyer la boisson si elle n'est pas empoisonnée, sinon elle doit renvoyer "Apple juice".

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

CastleDinner.replace_drink("Tea")
# => "Apple juice"
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Crystal Exercism

Prêt à commencer Dîner au château ?

Inscris-toi sur Exercism pour apprendre et maîtriser Crystal avec 26 concepts142 exercices, et un vrai mentorat humain, le tout gratuitement.