title: What does the + operand between types mean?
body: <p>With this example from <a href="https://doc.rust-lang.org/core/any/index.html" rel="nofollow noreferrer">core::any</a></p>
  
  <pre><code>use std::fmt::Debug;
  use std::any::Any;
  
  // Logger function for any type that implements Debug.
  fn log&lt;T: Any + Debug&gt;(value: &amp;T) {
      let value_any = value as &amp;dyn Any;
  
      // try to convert our value to a String.  If successful, we want to
      // output the String's length as well as its value.  If not, it's a
      // different type: just print it out unadorned.
      match value_any.downcast_ref::&lt;String&gt;() {
          Some(as_string) =&gt; {
              println!("String ({}): {}", as_string.len(), as_string);
          }
          None =&gt; {
              println!("{:?}", value);
          }
      }
  }
  
  // This function wants to log its parameter out prior to doing work with it.
  fn do_work&lt;T: Any + Debug&gt;(value: &amp;T) {
      log(value);
      // ...do some other work
  }
  
  fn main() {
      let my_string = "Hello World".to_string();
      do_work(&amp;my_string);
  
      let my_i8: i8 = 100;
      do_work(&amp;my_i8);
  }
  </code></pre>
  
  <p>This is the first time I’ve seen a <strong><code>+</code></strong>  operand between types <code>Any + Debug</code>. I’m assuming its like <a href="https://en.m.wikipedia.org/wiki/Algebraic_data_type" rel="nofollow noreferrer">algebraic types</a> and therefore would be an <code>Any</code> type with <code>Debug</code> type; however, I cannot find any docs under algebraic types in Rust.</p>
  
  <p>What is the <code>+</code> actually doing here, what is it called? Where can I find the docs on this?</p>