summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--exercises/quizzes/quiz3.rs18
-rw-r--r--rustlings-macros/info.toml12
-rw-r--r--solutions/quizzes/quiz3.rs70
3 files changed, 87 insertions, 13 deletions
diff --git a/exercises/quizzes/quiz3.rs b/exercises/quizzes/quiz3.rs
index f3cb1bc..c877c5f 100644
--- a/exercises/quizzes/quiz3.rs
+++ b/exercises/quizzes/quiz3.rs
@@ -3,26 +3,27 @@
// - 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
+// 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. Change the Grade in the second test to
-// "A+" to show that your changes allow alphabetical grades.
+// Make the necessary code changes in the struct `ReportCard` and the impl
+// block to support alphabetical report cards in addition to numerical ones.
+// TODO: Adjust the struct as described above.
struct ReportCard {
grade: f32,
student_name: String,
student_age: u8,
}
+// TODO: Adjust the impl block as described above.
impl ReportCard {
fn print(&self) -> String {
format!(
"{} ({}) - achieved a grade of {}",
- &self.student_name, &self.student_age, &self.grade
+ &self.student_name, &self.student_age, &self.grade,
)
}
}
@@ -44,21 +45,20 @@ mod tests {
};
assert_eq!(
report_card.print(),
- "Tom Wriggle (12) - achieved a grade of 2.1"
+ "Tom Wriggle (12) - achieved a grade of 2.1",
);
}
#[test]
fn generate_alphabetic_report_card() {
- // TODO: Make sure to change the grade here after you finish the exercise.
let report_card = ReportCard {
- grade: 2.1,
+ grade: "A+",
student_name: "Gary Plotter".to_string(),
student_age: 11,
};
assert_eq!(
report_card.print(),
- "Gary Plotter (11) - achieved a grade of A+"
+ "Gary Plotter (11) - achieved a grade of A+",
);
}
}
diff --git a/rustlings-macros/info.toml b/rustlings-macros/info.toml
index 92c878f..bed2eaf 100644
--- a/rustlings-macros/info.toml
+++ b/rustlings-macros/info.toml
@@ -805,10 +805,16 @@ https://doc.rust-lang.org/book/ch10-02-traits.html#specifying-multiple-trait-bou
name = "quiz3"
dir = "quizzes"
hint = """
-To find the best solution to this challenge you're going to need to think back
-to your knowledge of traits, specifically 'Trait Bound Syntax'
+To find the best solution to this challenge, you need to recall your knowledge
+of traits, specifically "Trait Bound Syntax":
+https://doc.rust-lang.org/book/ch10-02-traits.html#trait-bound-syntax
-You may also need this: `use std::fmt::Display;`."""
+Here is how to specify a trait bound for an implementation block:
+`impl<T: Trait1 + Trait2 + …> for Foo<T> { … }`
+
+You may need this:
+`use std::fmt::Display;`
+"""
# LIFETIMES
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+",
+ );
+ }
+}