title: Why can't a struct be assigned to a binding with a trait it implements
body: <p>I am trying to understand Rust polymorphism. From my background in OOP, I would expect the following Rust code to work:</p>
  
  <pre><code>use std::io::{stdin, Read};
  
  fn main() {
      let r: Read = stdin();
      println!("ok");
  }
  </code></pre>
  
  <p>But it doesn't:</p>
  
  <pre class="lang-none prettyprint-override"><code>4 |     let r: Read = stdin();
    |                   ^^^^^^^ expected trait std::io::Read, found struct `std::io::Stdin`
  </code></pre>
  
  <p>I know that there's a <a href="https://doc.rust-lang.org/std/io/trait.Read.html" rel="noreferrer"><code>Read</code></a> impl for <code>StdIn</code>, so how can I make this (or whatever is the correct way to do this) work, ie. use <code>Stdin</code>, or a <code>File</code>, or even a <code>String</code> if possible (couldn't find a implementation for that) be used where a <code>Read</code> is expected?</p>
  
  <p>I don't think I can use generics here as I need to pass an instance of <code>r</code>, which can be whatever that implements <code>Read</code>, to another method later, but please tell me if I am wrong.</p>