Aller au contenu principal
U/
Idiomes
rust

Chaîner des Result avec l'opérateur ?

Lire une ligne sur stdin, la parser en i32 et calculer son carré en chaînant les opérations avec l'opérateur ? pour propager les erreurs jusqu'au main.

30 minPublié le 20 mai 2026Proposé par Anonyme

Défi

// Lisez attentivement, codez sur votre machine

Énoncé

Écrire une fonction lire_et_elever_au_carre() -> Result<i64, String> qui : lit une ligne sur stdin, supprime le saut de ligne, parse la chaîne en i32, puis retourne le carré de la valeur sous forme de i64. Toutes les opérations faillibles propagent leur erreur avec ?. Dans main, appeler la fonction et afficher le résultat ou l'erreur sur stderr.

Contraintes

  • Compilé avec rustc --edition=2021 main.rs.
  • main doit avoir la signature fn main() (pas -> Result).
  • Les erreurs sont affichées sur stderr via eprintln!.
  • Pas de unwrap() ni de expect() dans le code final.
  • Deux opérations peuvent échouer et leurs types d'erreur diffèrent : read_line renvoie un std::io::Error, parse un ParseIntError. Aucun des deux ne se convertit tout seul en String — chacun doit être converti avant que ? puisse le propager, sans quoi le code ne compile pas.
  • Seule std::io est utilisée pour la lecture.

Exemple

Entrée valide :

12

Sortie sur stdout :

Carré : 144

Entrée invalide :

abc

Sortie sur stderr :

Erreur : invalid digit found in string
Espace solution
// À garder en tête
  • D'abord, faire marcher

    On ne cherche pas à optimiser : d'abord, on fait marcher le truc. Optimiser vient ensuite — et ça aussi, ça s'apprend. (Si un défi porte sur l'optimisation, son énoncé le précise.)

  • Pas de mauvaise réponse

    Il n'y a pas de mauvaise réponse à un défi. Le but, c'est de le faire. Ce qui compte, c'est de s'entraîner.

  • Trop dur ? Au suivant

    Un défi te résiste ? N'hésite pas à en prendre un autre. Ils seront encore là demain.