summaryrefslogtreecommitdiff
path: root/solutions/quizzes/quiz3.rs
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-06-27 13:01:52 +0200
committermo8it <mo8it@proton.me>2024-06-27 13:01:52 +0200
commit64c2de95ca95c1d23dcb416723b33ccdfca9c956 (patch)
treeb39bba53ce6c372160f98e56e89a50311e8f8e83 /solutions/quizzes/quiz3.rs
parentc1707404231e5a1d7bc837e21faf34fdc51db0bf (diff)
quiz3 solution
Diffstat (limited to 'solutions/quizzes/quiz3.rs')
-rw-r--r--solutions/quizzes/quiz3.rs70
1 files changed, 69 insertions, 1 deletions
diff --git a/solutions/quizzes/quiz3.rs b/solutions/quizzes/quiz3.rs
index 4e18198..e3413fd 100644
--- a/solutions/quizzes/quiz3.rs
+++ b/solutions/quizzes/quiz3.rs
@@ -1 +1,69 @@
-// Solutions will be available before the stable release. Thank you for testing the beta version 🥰
+// This quiz tests:
+// - Generics
+// - Traits
+//
+// An imaginary magical school has a new report card generation system written
+// in Rust! Currently, the system only supports creating report cards where the
+// student's grade is represented numerically (e.g. 1.0 -> 5.5). However, the
+// school also issues alphabetical grades (A+ -> F-) and needs to be able to
+// print both types of report card!
+//
+// Make the necessary code changes in the struct `ReportCard` and the impl
+// block to support alphabetical report cards in addition to numerical ones.
+
+use std::fmt::Display;
+
+// Make the struct generic over `T`.
+struct ReportCard<T> {
+ // ^^^
+ grade: T,
+ // ^
+ student_name: String,
+ student_age: u8,
+}
+
+// To be able to print the grade, it has to implement the `Display` trait.
+impl<T: Display> ReportCard<T> {
+ // ^^^^^^^ require that `T` implements `Display`.
+ fn print(&self) -> String {
+ format!(
+ "{} ({}) - achieved a grade of {}",
+ &self.student_name, &self.student_age, &self.grade,
+ )
+ }
+}
+
+fn main() {
+ // You can optionally experiment here.
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn generate_numeric_report_card() {
+ let report_card = ReportCard {
+ grade: 2.1,
+ student_name: "Tom Wriggle".to_string(),
+ student_age: 12,
+ };
+ assert_eq!(
+ report_card.print(),
+ "Tom Wriggle (12) - achieved a grade of 2.1",
+ );
+ }
+
+ #[test]
+ fn generate_alphabetic_report_card() {
+ let report_card = ReportCard {
+ grade: "A+",
+ student_name: "Gary Plotter".to_string(),
+ student_age: 11,
+ };
+ assert_eq!(
+ report_card.print(),
+ "Gary Plotter (11) - achieved a grade of A+",
+ );
+ }
+}