They used `into()` because it&#x27;s the shortest. The more idiomatic options are all of the other ones: String::from, .to_string(), and .to_owned() (Strings implement a lot of generic interfaces.)<p>The &amp;* converts a String to a &amp;str. I would have done it in the match rather than here, personally.<p><pre><code>  &gt; Why are they necessary for the compiler?
</code></pre>
Rust does not heap allocate things automatically nor convert types automatically. This is the side effect: you can see exactly how much allocation is going on, and know exactly how stuff is being converted.<p>(We do have a very small and very specific set of conversions that will happen, they don&#x27;t here, though.)<p><pre><code>  &gt; Why is there an .unwrap() on writeln! ? To force a panic if the write failed? 
</code></pre>
Yes. The compiler will warn you that you&#x27;re ignoring the errors on the write, and panicking is one way of handling it.