+// 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 {
+ 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.
+ min = Number(match min {
+ Nothing => e,
+ Number(n) => std::cmp::min(n, e)
+ });
+ }
+ // The `return` keyword exists in Rust, but it is rarely used. Instead, we typically
+ // make use of the fact that the entire function body is an expression, so we can just
+ // write down the desired return value.
+ min
+}