}
}
-pub mod part0203 {
+pub mod part02 {
// A polymorphic (generic) "some value, or no value"
pub enum SomethingOrNothing<T> {
Something(T),
}
}
+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);
+ }
+ }
+}
//@ 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) |
// **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