add part03 solutions
authorRalf Jung <post@ralfj.de>
Sat, 4 Feb 2023 19:29:27 +0000 (20:29 +0100)
committerRalf Jung <post@ralfj.de>
Sat, 4 Feb 2023 19:29:27 +0000 (20:29 +0100)
solutions/src/vec.rs
src/part02.rs
src/part03.rs

index 8eff9160bb71dddce2de7bbae5d71448638295a2..faf51711caad6adb8deb928995e8028e09c8f1d8 100644 (file)
@@ -37,7 +37,7 @@ pub mod part01 {
     }
 }
 
-pub mod part0203 {
+pub mod part02 {
     // A polymorphic (generic) "some value, or no value"
     pub enum SomethingOrNothing<T>  {
         Something(T),
@@ -125,3 +125,63 @@ pub mod part0203 {
     }
 }
 
+pub mod part03 {
+    use std::io::prelude::*;
+    use std::io;
+
+    fn read_vec() -> Vec<i32> {
+        let mut vec: Vec<i32> = Vec::<i32>::new();
+        let stdin = io::stdin();
+        println!("Enter a list of numbers, one per line. End with Ctrl-D (Linux) or Ctrl-Z (Windows).");
+        for line in stdin.lock().lines() {
+            let line = line.unwrap();
+            match line.trim().parse::<i32>() {
+                Ok(num) => {
+                    vec.push(num)
+                },
+                // We don't care about the particular error, so we ignore it with a `_`.
+                Err(_) => {
+                    println!("What did I say about numbers?")
+                },
+            }
+        }
+
+        vec
+    }
+
+    use super::part02::{SomethingOrNothing,Something,Nothing,vec_min};
+
+    pub fn main() {
+        let vec = read_vec();
+        let min = vec_min(vec);
+        min.print2();
+    }
+
+    pub trait Print {
+        fn print(self);
+    }
+    impl Print for i32 {
+        fn print(self) {
+            print!("{}", self);
+        }
+    }
+
+    impl<T: Print> SomethingOrNothing<T> {
+        fn print2(self) {
+            match self {
+                Nothing => println!("The number is: <nothing>"),
+                Something(n) => {
+                    print!("The number is: ");
+                    n.print();
+                    println!();
+                }
+            }
+        }
+    }
+
+    impl Print for f32 {
+        fn print(self) {
+            print!("{}", self);
+        }
+    }
+}
index a24a9d0c3c992b1c858ab240cbe6b820ce4b087d..2bf4d9705f2fb6db87fead0ce24e18dcffd2c6bf 100644 (file)
@@ -148,7 +148,7 @@ pub fn main() {
 //@ If this printed `3`, then your generic `vec_min` is working! So get ready for the next part.
 
 // **Exercise 02.1**: Change your program such that it computes the minimum of a `Vec<f32>` (where
-// `f32` is the type // of 32-bit floating-point numbers). You should not change `vec_min` in any
+// `f32` is the type of 32-bit floating-point numbers). You should not change `vec_min` in any
 // way, obviously!
 
 //@ [index](main.html) | [previous](part01.html) | [raw source](workspace/src/part02.rs) |
index 44431e6da35c2b25376b0c5f4ddac9a7e0a61089..25f9386f4caf5ccd8cc70a49ce611a6ff64f0999 100644 (file)
@@ -101,7 +101,7 @@ pub fn main() {
 
 // **Exercise 03.1**: Define a trait `Print` to write a generic version of
 // `SomethingOrNothing::print`.
-// Implement that trait for `i32`, and change the code above to use it.
+// Implement that trait for `i32`, and change `main` above to use the new generic `print` function.
 // I will again provide a skeleton for this solution. It also shows how to attach bounds to generic
 // implementations (just compare it to the `impl` block from the previous exercise).
 // You can read this as "For all types `T` satisfying the `Print` trait, I provide an implementation