Quiz 3
// 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.
// 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,
)
}
}
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+",
);
}
}
In this quiz we are tasked to adjust
ReportCard
and its implementation to accept both text grade and float grade.We can use generics for this.
First we need to change the
ReportCard
struct so it will accept generic types forgrade
field like this:struct ReportCard<T> { grade: T, student_name: String, student_age: u8, }
Then we adjust the implementation to accept generics as well like this:
impl<T> ReportCard<T> { fn print(&self) -> String { format!( "{} ({}) - achieved a grade of {}", &self.student_name, &self.student_age, &self.grade, ) } }
But we still have some error below when compiling.
error[E0277]: `T` doesn't implement `std::fmt::Display`
This is because
format!
need certain traits.So we can add the
std::fmt::Display
trait into ourimpl
syntax like this:impl<T: std::fmt::Display> ReportCard<T> { fn print(&self) -> String { format!( "{} ({}) - achieved a grade of {}", &self.student_name, &self.student_age, &self.grade, ) } }
In this quiz Rust compiler is very useful, it can suggest what trait should be added in the
impl
syntax.
References
Last updated