defer refrences until later; introduce testing in part03
authorRalf Jung <post@ralfj.de>
Wed, 10 Jun 2015 06:59:45 +0000 (08:59 +0200)
committerRalf Jung <post@ralfj.de>
Wed, 10 Jun 2015 06:59:45 +0000 (08:59 +0200)
src/part01.rs
src/part02.rs
src/part03.rs

index 927a61782451c8f6cd5d73cdd552c0efc5cd9ed4..d046a1b70330f7769276a94abe9e488591a7be80 100644 (file)
@@ -34,16 +34,10 @@ fn number_or_default(n: NumberOrNothing, default: i32) -> i32 {
     }
 }
 
-// With this fresh knowledge, let us now refactor `vec_min`. First of all, we are doing a small change
-// to the type: `&Vec<i32>` denotes a *reference* to a `Vec<i32>`. You can think of this as a pointer
-// (in C terms): Arguments in Rust are passed *by value*, so we need to employ explicit references if
-// that's not what we want. References are per default immutable (like variables), a mutable reference
-// would be denoted `&mut Vec<i32>`.
-fn vec_min(v: &Vec<i32>) -> NumberOrNothing {
+// With this fresh knowledge, let us now refactor `vec_min`.
+fn vec_min(v: Vec<i32>) -> NumberOrNothing {
     let mut min = Nothing;
     for e in v {
-        // Now that `v` is just a reference, the same goes for `e`, so we have to dereference the pointer.
-        let e = *e;
         // Notice that all we do here is compute a new value for `min`, and that it will always end
         // up being a `Number` rather than `Nothing`. In Rust, the structure of the code
         // can express this uniformity.
@@ -87,7 +81,7 @@ fn read_vec() -> Vec<i32> {
 }
 pub fn part_main() {
     let vec = read_vec();
-    let min = vec_min(&vec);
+    let min = vec_min(vec);
     min.print();
 }
 // You will have to replace `part00` by `part01` in the `main` function in
index 7261f1900ac989b8a920367e5ebbc32b84420f7d..4e0fa6b8f2709c5a607213c8d91f4632dcc17ce3 100644 (file)
@@ -78,10 +78,9 @@ trait Minimum : Copy {
 // we cannot call `min`. Just try it! There is no reason to believe that `T` provides such an operation.
 // This is in strong contrast to C++, where the compiler only checks such details when the
 // function is actually used.
-fn vec_min<T: Minimum>(v: &Vec<T>) -> SomethingOrNothing<T> {
+fn vec_min<T: Minimum>(v: Vec<T>) -> SomethingOrNothing<T> {
     let mut min = Nothing;
     for e in v {
-        let e = *e;
         min = Something(match min {
             Nothing => e,
             Something(n) => T::min(n, e)
@@ -125,7 +124,7 @@ fn read_vec() -> Vec<i32> {
 }
 pub fn part_main() {
     let vec = read_vec();
-    let min = vec_min(&vec);
+    let min = vec_min(vec);
     min.print();
 }
 
index cb0807b87c5dcf7c0bf128f7cde976a5fd888881..d4805e7dbfef6dfdf15444b4e70148cc58478ed6 100644 (file)
@@ -30,10 +30,9 @@ trait Minimum : Copy {
     fn min(a: Self, b: Self) -> Self;
 }
 
-fn vec_min<T: Minimum>(v: &Vec<T>) -> SomethingOrNothing<T> {
+fn vec_min<T: Minimum>(v: Vec<T>) -> SomethingOrNothing<T> {
     let mut min = Nothing;
     for e in v {
-        let e = *e;
         min = Something(match min {
             Nothing => e,
             Something(n) => T::min(n, e)
@@ -48,20 +47,34 @@ impl Minimum for i32 {
     }
 }
 
-use std::fmt;
-impl<T: fmt::Display> fmt::Display for SomethingOrNothing<T> {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+impl SomethingOrNothing<i32> {
+    fn print(self) {
         match self {
-            &Something(ref t) => t.fmt(f),
-            &Nothing => "Nothing".fmt(f),
-        }
+            Nothing => println!("The number is: <nothing>"),
+            Something(n) => println!("The number is: {}", n),
+        };
     }
 }
-
 pub fn part_main() {
     let vec = read_vec();
-    let min = vec_min(&vec);
-    println!("The minimum is: {}", min);
+    let min = vec_min(vec);
+    min.print();
+}
+
+impl SomethingOrNothing<i32> {
+    fn equals(self, other: Self) -> bool {
+        match (self, other) {
+            (Nothing     , Nothing      ) => true,
+            (Something(n), Something (m)) => n == m,
+            _ => false,
+        }
+    }
+}
+
+#[test]
+fn tes_vec_min() {
+    assert!(vec_min(vec![6,325,33,532,5,7]).equals(Something(5)));
+    assert!(vec_min(vec![]).equals(Nothing));
 }
 
 // [index](main.html) | [previous](part02.html) | next