title: Why is a borrowed range not an iterator, but the range is?
body: <p>An example of how a range gets consumed is:</p>
  <pre class="lang-rust prettyprint-override"><code>let coll = 1..10;
  for i in coll {
      println!(&quot;i is {}&quot;, &amp;i);
  }
  println!(&quot;coll length is {}&quot;, coll.len());
  </code></pre>
  <p>This will fail with</p>
  <pre class="lang-none prettyprint-override"><code>error[E0382]: borrow of moved value: `coll`
     --&gt; src/main.rs:6:35
      |
  2   |     let coll = 1..10;
      |         ---- move occurs because `coll` has type `std::ops::Range&lt;i32&gt;`, which does not implement the `Copy` trait
  3   |     for i in coll {
      |              ----
      |              |
      |              `coll` moved due to this implicit call to `.into_iter()`
      |              help: consider borrowing to avoid moving into the for loop: `&amp;coll`
  ...
  6   |     println!(&quot;coll length is {}&quot;, coll.len());
      |                                   ^^^^ value borrowed here after move
      |
  note: this function consumes the receiver `self` by taking ownership of it, which moves `coll`
  </code></pre>
  <p>The usual way to fix this is to borrow the <code>coll</code>, but that doesn't work here:</p>
  <pre class="lang-none prettyprint-override"><code>error[E0277]: `&amp;std::ops::Range&lt;{integer}&gt;` is not an iterator
   --&gt; src/main.rs:3:14
    |
  3 |     for i in &amp;coll {
    |              -^^^^
    |              |
    |              `&amp;std::ops::Range&lt;{integer}&gt;` is not an iterator
    |              help: consider removing the leading `&amp;`-reference
    |
    = help: the trait `std::iter::Iterator` is not implemented for `&amp;std::ops::Range&lt;{integer}&gt;`
    = note: required by `std::iter::IntoIterator::into_iter`
  </code></pre>
  <p>Why is that? Why is a borrowed range not an iterator, but the range is? Is it interpreting it differently?</p>