summaryrefslogtreecommitdiff
path: root/exercises/generics
diff options
context:
space:
mode:
Diffstat (limited to 'exercises/generics')
-rw-r--r--exercises/generics/README.md7
-rw-r--r--exercises/generics/generics1.rs10
-rw-r--r--exercises/generics/generics2.rs30
-rw-r--r--exercises/generics/generics3.rs46
4 files changed, 93 insertions, 0 deletions
diff --git a/exercises/generics/README.md b/exercises/generics/README.md
new file mode 100644
index 0000000..7105f06
--- /dev/null
+++ b/exercises/generics/README.md
@@ -0,0 +1,7 @@
+### Generics
+
+In this section you'll learn about saving yourself many lines of code with generics!
+
+### Book Sections
+
+- [Generic Data Types](https://doc.rust-lang.org/stable/book/ch10-01-syntax.html) \ No newline at end of file
diff --git a/exercises/generics/generics1.rs b/exercises/generics/generics1.rs
new file mode 100644
index 0000000..d075a4d
--- /dev/null
+++ b/exercises/generics/generics1.rs
@@ -0,0 +1,10 @@
+// This shopping list program isn't compiling!
+// Use your knowledge of generics to fix it.
+
+// I AM NOT DONE
+
+fn main() {
+ let mut shopping_list: Vec<?> = Vec::new();
+ shopping_list.push("milk");
+}
+
diff --git a/exercises/generics/generics2.rs b/exercises/generics/generics2.rs
new file mode 100644
index 0000000..1fe5041
--- /dev/null
+++ b/exercises/generics/generics2.rs
@@ -0,0 +1,30 @@
+// This powerful wrapper provides the ability to store a positive integer value.
+// Rewrite it using generics so that it supports wrapping ANY type.
+
+// I AM NOT DONE
+struct Wrapper<u32> {
+ value: u32
+}
+
+impl<u32> Wrapper<u32> {
+ pub fn new(value: u32) -> Self {
+ Wrapper { value }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn store_u32_in_wrapper() {
+ assert_eq!(Wrapper::new(42).value, 42);
+ }
+
+ #[test]
+ fn store_str_in_wrapper() {
+ // TODO: Delete this assert and uncomment the one below once you have finished the exercise.
+ assert!(false);
+ // assert_eq!(Wrapper::new("Foo").value, "Foo");
+ }
+} \ No newline at end of file
diff --git a/exercises/generics/generics3.rs b/exercises/generics/generics3.rs
new file mode 100644
index 0000000..cd3232a
--- /dev/null
+++ b/exercises/generics/generics3.rs
@@ -0,0 +1,46 @@
+// 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 to support alphabetical report cards, thereby making the second
+// test pass.
+
+// I AM NOT DONE
+pub struct ReportCard {
+ pub grade: f32,
+ pub student_name: String,
+ pub student_age: u8,
+}
+
+impl ReportCard {
+ pub fn print(&self) -> String {
+ format!("{} ({}) - achieved a grade of {}", &self.student_name, &self.student_age, &self.grade)
+ }
+}
+
+#[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() {
+ // TODO: Make sure to change the grade here after you finish the exercise.
+ let report_card = ReportCard {
+ grade: 2.1,
+ student_name: "Gary Plotter".to_string(),
+ student_age: 11,
+ };
+ assert_eq!(report_card.print(), "Gary Plotter (11) - achieved a grade of A+");
+ }
+} \ No newline at end of file