-// If you enable the bad line, Rust will reject the code. Why? The problem is that we are modifying the
-// number while iterating over it. In other languages, this can have all sorts of effects from inconsistent
-// data or throwing an exception (Java) to bad pointers being dereferenced (C++). Rust, however, is able to
-// detect this situation. When you call `iter`, you have to borrow `b` for some lifetime `'a`, and you obtain
-// `Iter<'a>`. This is an iterator that's only valid for lifetime `'a`. Gladly, we have this annotation available
-// to make such a statement. Now, since we are using the iterator throughout the loop, `'a` has to span the loop.
-// This `b` is borrowed for the duration of the loop, and we cannot mutate it. This is yet another example for
-// how the combination of mutation and aliasing leads to undesired effects (not necessarily crashes, like in Java),
-// which Rust successfully prevents.
-//
-// Technically speaking, there's one more subtlety that I did not explain yet. We never explicitly tied the lifetime `'a` of the
-// iterator to the loop so how does this happen? The answer lies in the full type of `next()`:
-// `fn<'a, 'b>(&'b mut Iter<'a>) -> Option<u64>`. Since `next()` takes a *borrowed* iterator, there are two lifetimes involved:
-// The lifetime of the borrow of the iterator, and the lifetime of the iterator itself. In such a case of nested lifetimes,
-// Rust implicitly adds the additional constraint that the inner lifetime *outlives* the outer one: The borrow of an iterator
-// cannot be valid for longer than the iterator itself is valid. This means that the lifetime `'a` of the iterator needs
-// to outlive every call to `next()`, and hence the loop. Lucky enough, this all happens without our intervention.
+//@ If you enable the bad line, Rust will reject the code. Why? The problem is that we are modifying the
+//@ number while iterating over it. In other languages, this can have all sorts of effects from inconsistent
+//@ data or throwing an exception (Java) to bad pointers being dereferenced (C++). Rust, however, is able to
+//@ detect this situation. When you call `iter`, you have to borrow `b` for some lifetime `'a`, and you obtain
+//@ `Iter<'a>`. This is an iterator that's only valid for lifetime `'a`. Gladly, we have this annotation available
+//@ to make such a statement. Rust enforces that `'a` spans every call to `next`, which means it has to span the loop.
+//@ Thus `b` is borrowed for the duration of the loop, and we cannot mutate it. This is yet another example for
+//@ how the combination of mutation and aliasing leads to undesired effects (not necessarily crashes, think of Java),
+//@ which Rust successfully prevents.
+
+// ## Iterator conversion trait
+//@ If you closely compare the `for` loop in `main` above, with the one in `part06::vec_min`, you will notice that we were able to write
+//@ `for e in v` earlier, but now we have to call `iter`. Why is that? Well, the `for` sugar is not actually tied to `Iterator`.
+//@ Instead, it demands an implementation of [`IntoIterator`](http://doc.rust-lang.org/stable/std/iter/trait.IntoIterator.html).
+//@ That's a trait of types that provide a *conversion* function into some kind of iterator. These conversion traits are a frequent
+//@ pattern in Rust: Rather than demanding that something is an iterator, or a string, or whatever; one demands that something
+//@ can be converted to an iterator/string/whatever. This provides convenience similar to overloading of functions: The function
+//@ can be called with lots of different types. By implementing such traits for your types, you can even make your own types
+//@ work smoothly with existing library functions. As usually for Rust, this abstraction comes at zero cost: If your data is already
+//@ of the right type, the conversion function will not do anything and trivially be optimized away.