}
}
-// 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.
}
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
// 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)
}
pub fn part_main() {
let vec = read_vec();
- let min = vec_min(&vec);
+ let min = vec_min(vec);
min.print();
}
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)
}
}
-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