title: Why does `rev().rev()` work but `rev().skip(1).rev()` does not?
body: <p>As title, in Rust, <code>.rev().rev()</code> works,  <code>.rev().skip(1)</code> works, but <code>.rev().skip(1).rev()</code> does not. The following is the demonstration:</p>
  <pre><code>// This compiles
  fn main() {
      let s = &quot;Hello!&quot;;
      println!(&quot;{}&quot;, &amp;s.chars().rev().skip(1).collect::&lt;String&gt;());
  }
  </code></pre>
  <pre><code>// This compiles
  fn main() {
      let s = &quot;Hello!&quot;;
      println!(&quot;{}&quot;, &amp;s.chars().rev().rev().collect::&lt;String&gt;());
  }
  </code></pre>
  <pre><code>// This *does not* compile
  fn main() {
      let s = &quot;Hello!&quot;;
      println!(&quot;{}&quot;, &amp;s.chars().rev().skip(1).rev().collect::&lt;String&gt;());
  }
  </code></pre>
  <p>The last one does not compile:</p>
  <pre class="lang-none prettyprint-override"><code>error[E0277]: the trait bound `Chars&lt;'_&gt;: ExactSizeIterator` is not satisfied
   --&gt; src/main.rs:3:45
    |
  3 |     println!(&quot;{}&quot;, &amp;s.chars().rev().skip(1).rev().collect::&lt;String&gt;());
    |                                             ^^^ the trait `ExactSizeIterator` is not implemented for `Chars&lt;'_&gt;`
    |
    = note: required because of the requirements on the impl of `ExactSizeIterator` for `Rev&lt;Chars&lt;'_&gt;&gt;`
    = note: required because of the requirements on the impl of `DoubleEndedIterator` for `Skip&lt;Rev&lt;Chars&lt;'_&gt;&gt;&gt;`
  
  error[E0599]: the method `collect` exists for struct `Rev&lt;Skip&lt;Rev&lt;Chars&lt;'_&gt;&gt;&gt;&gt;`, but its trait bounds were not satisfied
    --&gt; src/main.rs:3:51
     |
  3  |        println!(&quot;{}&quot;, &amp;s.chars().rev().skip(1).rev().collect::&lt;String&gt;());
     |                                                      ^^^^^^^ method cannot be called on `Rev&lt;Skip&lt;Rev&lt;Chars&lt;'_&gt;&gt;&gt;&gt;` due to unsatisfied trait bounds
     |
     = note: the following trait bounds were not satisfied:
             `Skip&lt;Rev&lt;Chars&lt;'_&gt;&gt;&gt;: DoubleEndedIterator`
             which is required by `Rev&lt;Skip&lt;Rev&lt;Chars&lt;'_&gt;&gt;&gt;&gt;: Iterator`
             `Rev&lt;Skip&lt;Rev&lt;Chars&lt;'_&gt;&gt;&gt;&gt;: Iterator`
             which is required by `&amp;mut Rev&lt;Skip&lt;Rev&lt;Chars&lt;'_&gt;&gt;&gt;&gt;: Iterator`
  </code></pre>
  <p><sup><a href="https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2021&amp;gist=b18abcd28e15f1ad5cbee96d3a12491f" rel="noreferrer">Playground</a></sup></p>
  <p>Could someone explain why this is the case?</p>