Les types avancés
Ces exercices portent sur les types énumérés, les fonctions associées et les méthodes, ainsi que le pattern matching. Faites-les dans l'ordre.
Feu tricolore
Définir enum Feu { Rouge, Orange, Vert } et une fonction qui renvoie l'état
suivant du feu : Vert -> Orange -> Rouge -> Vert.
- Objectif :
enumsans données,match. - Signature suggérée :
fn suivant(f: Feu) -> Feu. - Cas de test :
suivant(Feu::Vert)->Feu::Orange,suivant(Feu::Orange)->Feu::Rouge,suivant(Feu::Rouge)->Feu::Vert.
Point cardinal
Définir enum Direction { Nord, Est, Sud, Ouest } et une fonction qui fait
tourner d'un quart de tour vers la droite : Nord -> Est -> Sud -> Ouest -> Nord.
- Objectif :
enum,match. - Signature suggérée :
fn tourner_droite(d: Direction) -> Direction. - Cas de test :
tourner_droite(Direction::Nord)->Direction::Est,tourner_droite(Direction::Ouest)->Direction::Nord.
Forme géométrique
Définir enum Forme { Cercle(f64), Rectangle(f64, f64), Triangle { base: f64, hauteur: f64 } }
et une méthode aire(&self) -> f64.
- Objectif : variantes avec données (tuple et struct),
matchavec liaison de valeurs, méthode prenant&self. - Signature suggérée :
impl Forme { fn aire(&self) -> f64 { /* ... */ } }. - Cas de test :
Forme::Rectangle(3.0, 4.0).aire()->12.0,Forme::Triangle { base: 6.0, hauteur: 2.0 }.aire()->6.0,Forme::Cercle(1.0).aire()-> environ3.14159.
Pierre-feuille-ciseaux
Définir enum Coup { Pierre, Feuille, Ciseaux } et enum Issue { Gagne, Perd, Nul }.
Écrire une fonction qui donne l'issue du premier joueur.
- Objectif :
matchsur un tuple(a, b). - Signature suggérée :
fn jouer(a: Coup, b: Coup) -> Issue. - Cas de test :
jouer(Coup::Pierre, Coup::Ciseaux)->Issue::Gagne,jouer(Coup::Pierre, Coup::Feuille)->Issue::Perd,jouer(Coup::Feuille, Coup::Feuille)->Issue::Nul.
Week-end
Définir enum Jour { Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi, Dimanche }
et une fonction qui dit si c'est le week-end.
- Objectif :
matchavec motifs multiples (Jour::Samedi | Jour::Dimanche) ou_. - Signature suggérée :
fn est_weekend(j: Jour) -> bool. - Cas de test :
est_weekend(Jour::Samedi)->true,est_weekend(Jour::Dimanche)->true,est_weekend(Jour::Lundi)->false.