+// Now, what's happening here? Why do we have to write `clone()`, and why did we not
+// have to write that in our previous version?
+//
+// The answer is already hidden in the type of `vec_min`: `v` is just borrowed, but
+// the Option<BigInt> that it returns is *owned*. We can't just return one
+// of the elements of `v`, as that would mean that it is no longer in the vector!
+// In our code, this comes up when we update the intermediate variable `min`, which
+// also has type `Option<BigInt>`. If you replace `e.clone()` in the `None` arm
+// with `*e`, Rust will complain "Cannot move out of borrowed content". That's because
+// `e` is a `&BigInt`. Assigning `min` to `*e` works just like a function call:
+// Ownership of the underlying data (in this case, the digits) is transferred from
+// the vector to `min`. But that's not allowed, since we must retain the vector
+// in its existing state. After cloning `e`, we own the copy that was created,
+// and hence we can store it in `min`.<br/>
+// Of course, making such a full copy is expensive, so we'd like to avoid it.
+// That's going to happen in the next part.
+//
+// But before we go there, I should answer the second question I brought up above:
+// Why did our old `vec_min` work? We stored the minimal `i32` locally without
+// cloning, and Rust did not complain. That's because there isn't really much
+// of an "ownership" when it comes to types like `i32` or `bool`: If you move
+// the value from one place to another, then both instance are independent
+// and complete instances of their type. This is in stark contrast to types
+// like `Vec<i32>`, where merely moving the value results in both the old
+// and the new vector to point to the same underlying buffer.
+//
+// Rust calls types like `i32` that can be freely duplicated `Copy` types.
+// `Copy` is another trait, and it is implemented for the basic types of
+// the language. Remember how we defined the trait `Minimum` by writing
+// `trait Minimum : Copy { ...`? This tells Rust that every type that
+// implements `Minimum` must also implement `Copy`, and that's why Rust
+// accepted our generic `vec_min` in part 02.
+//
+// Curiously, `Copy` is a trait that does not require any method to
+// be implemented. Implementing `Copy` is merely a semantic statement,
+// saying that the idea of ownership does not really apply to this type.
+// Traits without methods are called *marker traits*. We will see some
+// more examples of such traits later.
+//
+// If you try to implement `Copy` for `BigInt`, you will notice that Rust
+// does not let you do that. A type can only be `Copy` if all its elements
+// are `Copy`, and that's not the case for `BigInt`. However, we can make
+// `SomethingOrNothing<T>` copy if `T` is `Copy`.
+impl<T: Copy> Copy for SomethingOrNothing<T>{}
+// Again, Rust can generate implementations of `Copy` automatically. If
+// you add `#[derive(Copy,Clone)]` right before the definition of `SomethingOrNothing`,
+// both `Copy` and `Clone` will automatically be implemented.
+
+// In closing this part, I'd like to give you another perspective on the
+// move semantics (i.e., ownership passing) that Rust applies, and how
+// `Copy` and `Clone` fit.<br/>
+// When Rust code is executed, passing a value (like `i32` or `Vec<i32>`)
+// to a function will always result in a shallow copy being performed: Rust
+// just copies the bytes representing that value, and considers itself done.
+// That's just like the default copy constructor in C++. Rust, however, will
+// consider this a destructive operation: After copying the bytes elsewhere,
+// the original value must no longer be used. After all, the two could not
+// share a pointer! If, however, you mark a type `Copy`, then Rust will *not*
+// consider a move destructive, and just like in C++, the old and new value
+// can happily coexist. Now, Rust does not allow to to overload the copy
+// constructor. This means that passing a value around will always be a fast
+// operation, no allocation or copying of large data of the heap will happen.
+// In the situations where you would write a copy constructor in C++ (and hence
+// incur a hidden cost on every copy of this type), you'd have the type *not*
+// implement `Copy`, but only `Clone`. This makes the cost explicit.