title: Why can't I use `&Iterator<Item = &String>` as an iterator?
body: <p>I have the following function that's supposed to find and return the longest length of a <code>String</code> given an <code>Iterator</code>:</p>
  
  <pre><code>fn max_width(strings: &amp;Iterator&lt;Item = &amp;String&gt;) -&gt; usize {
      let mut max_width = 0;
      for string in strings {
          if string.len() &gt; max_width {
              max_width = string.len();
          }
      }
      return max_width;
  }
  </code></pre>
  
  <p>However, the compiler gives me the following error:</p>
  
  <pre class="lang-none prettyprint-override"><code>error[E0277]: the trait bound `&amp;std::iter::Iterator&lt;Item=&amp;std::string::String&gt;: std::iter::Iterator` is not satisfied
   --&gt; src/main.rs:3:19
    |
  3 |     for string in strings {
    |                   ^^^^^^^ `&amp;std::iter::Iterator&lt;Item=&amp;std::string::String&gt;` is not an iterator; maybe try calling `.iter()` or a similar method
    |
    = help: the trait `std::iter::Iterator` is not implemented for `&amp;std::iter::Iterator&lt;Item=&amp;std::string::String&gt;`
    = note: required by `std::iter::IntoIterator::into_iter`
  </code></pre>
  
  <p>I'm new to Rust, and terribly confused by this, since I thought I was explicitly passing in an iterator. Calling <code>strings.iter()</code> tells me that it is not implemented, and calling <code>strings.into_iter()</code> sends me down a mutability rabbit-hole, and I certainly don't want to mutate the passed argument.</p>
  
  <p>How can I iterate over my strings?</p>