quiz3 solution

This commit is contained in:
mo8it 2024-06-27 13:01:52 +02:00
parent c170740423
commit 64c2de95ca
3 changed files with 87 additions and 13 deletions

View file

@ -3,26 +3,27 @@
// - Traits // - Traits
// //
// An imaginary magical school has a new report card generation system written // 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 // 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 // school also issues alphabetical grades (A+ -> F-) and needs to be able to
// print both types of report card! // print both types of report card!
// //
// Make the necessary code changes in the struct ReportCard and the impl block // Make the necessary code changes in the struct `ReportCard` and the impl
// to support alphabetical report cards. Change the Grade in the second test to // block to support alphabetical report cards in addition to numerical ones.
// "A+" to show that your changes allow alphabetical grades.
// TODO: Adjust the struct as described above.
struct ReportCard { struct ReportCard {
grade: f32, grade: f32,
student_name: String, student_name: String,
student_age: u8, student_age: u8,
} }
// TODO: Adjust the impl block as described above.
impl ReportCard { impl ReportCard {
fn print(&self) -> String { fn print(&self) -> String {
format!( format!(
"{} ({}) - achieved a grade of {}", "{} ({}) - 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!( assert_eq!(
report_card.print(), report_card.print(),
"Tom Wriggle (12) - achieved a grade of 2.1" "Tom Wriggle (12) - achieved a grade of 2.1",
); );
} }
#[test] #[test]
fn generate_alphabetic_report_card() { fn generate_alphabetic_report_card() {
// TODO: Make sure to change the grade here after you finish the exercise.
let report_card = ReportCard { let report_card = ReportCard {
grade: 2.1, grade: "A+",
student_name: "Gary Plotter".to_string(), student_name: "Gary Plotter".to_string(),
student_age: 11, student_age: 11,
}; };
assert_eq!( assert_eq!(
report_card.print(), report_card.print(),
"Gary Plotter (11) - achieved a grade of A+" "Gary Plotter (11) - achieved a grade of A+",
); );
} }
} }

View file

@ -805,10 +805,16 @@ https://doc.rust-lang.org/book/ch10-02-traits.html#specifying-multiple-trait-bou
name = "quiz3" name = "quiz3"
dir = "quizzes" dir = "quizzes"
hint = """ hint = """
To find the best solution to this challenge you're going to need to think back To find the best solution to this challenge, you need to recall your knowledge
to your knowledge of traits, specifically 'Trait Bound Syntax' 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 # LIFETIMES

View file

@ -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+",
);
}
}