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 : enum sans 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), match avec 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() -> environ 3.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 : match sur 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 : match avec 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.