<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jazz Thumyat 🦀</title>
    <description>The latest articles on DEV Community by Jazz Thumyat 🦀 (@jazz_thumyat).</description>
    <link>https://dev.to/jazz_thumyat</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4001494%2F5eb127d6-d0e3-43aa-9172-a8941817994e.jpg</url>
      <title>DEV Community: Jazz Thumyat 🦀</title>
      <link>https://dev.to/jazz_thumyat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jazz_thumyat"/>
    <language>en</language>
    <item>
      <title>Why Does `Box&lt;[T]&gt;` Support `iter()` But `Box&lt;i32&gt;` Doesn't?</title>
      <dc:creator>Jazz Thumyat 🦀</dc:creator>
      <pubDate>Tue, 30 Jun 2026 12:31:45 +0000</pubDate>
      <link>https://dev.to/jazz_thumyat/why-does-boxt-support-iter-but-box-doesnt-h5k</link>
      <guid>https://dev.to/jazz_thumyat/why-does-boxt-support-iter-but-box-doesnt-h5k</guid>
      <description>&lt;p&gt;Have you ever wondered why you can call &lt;code&gt;iter()&lt;/code&gt; on &lt;code&gt;Box&amp;lt;[T]&amp;gt;&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;  
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;box_of_slice&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="nf"&gt;.into_boxed_slice&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;box_of_slice&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;box_of_slice&lt;/code&gt; is of type &lt;code&gt;Box&amp;lt;[i32]&amp;gt;&lt;/code&gt;, and we can iterate over it. The reason is that &lt;a href="https://doc.rust-lang.org/src/alloc/boxed.rs.html#2223" rel="noopener noreferrer"&gt;&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt; implements &lt;code&gt;Deref&amp;lt;Target = T&amp;gt;&lt;/code&gt;&lt;/a&gt;. Rust automatically follows the deref chain until it reaches a type that has the &lt;code&gt;iter()&lt;/code&gt; method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Box&amp;lt;[i32]&amp;gt;  →  deref  →  [i32]  →  has .iter()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But for &lt;code&gt;Box&amp;lt;i32&amp;gt;&lt;/code&gt;, we can't call &lt;code&gt;iter()&lt;/code&gt; because &lt;code&gt;i32&lt;/code&gt; isn't iterable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Box&amp;lt;i32&amp;gt;    →  deref  →  i32    →  no .iter()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;i32&lt;/code&gt; is a scalar with no concept of iteration. Once &lt;code&gt;Box&amp;lt;i32&amp;gt;&lt;/code&gt; dereferences to &lt;code&gt;i32&lt;/code&gt;, there's no &lt;code&gt;iter()&lt;/code&gt; method to call. This is why deref coercion in Rust is so powerful—&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt; can act like &lt;code&gt;T&lt;/code&gt; in terms of available methods, but only if &lt;code&gt;T&lt;/code&gt; actually supports them.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>learningrust</category>
    </item>
    <item>
      <title>How Rust Decides Whether an Array Is Copy</title>
      <dc:creator>Jazz Thumyat 🦀</dc:creator>
      <pubDate>Sat, 27 Jun 2026 15:03:05 +0000</pubDate>
      <link>https://dev.to/jazz_thumyat/how-rust-decides-whether-an-array-is-copy-29kc</link>
      <guid>https://dev.to/jazz_thumyat/how-rust-decides-whether-an-array-is-copy-29kc</guid>
      <description>&lt;p&gt;In Rust, we all know that &lt;code&gt;Vec&lt;/code&gt; is &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;Copy&lt;/code&gt;, which means it does not implement the &lt;code&gt;Copy&lt;/code&gt; trait. As a result, after iterating over a &lt;code&gt;Vec&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{:?}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// compiler error: value borrowed here after move&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the compiler reports an error because &lt;code&gt;num&lt;/code&gt; has been moved. When we write &lt;code&gt;for i in num&lt;/code&gt;, Rust desugars it into something like &lt;code&gt;for i in num.into_iter()&lt;/code&gt;. The &lt;code&gt;into_iter&lt;/code&gt; method takes &lt;code&gt;self&lt;/code&gt; by value:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[inline]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;into_iter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;IntoIter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because &lt;code&gt;Vec&amp;lt;T&amp;gt;&lt;/code&gt; is not &lt;code&gt;Copy&lt;/code&gt;, passing it by value &lt;strong&gt;moves&lt;/strong&gt; it into the iterator. Ownership is transferred to the iterator, so &lt;code&gt;num&lt;/code&gt; can no longer be used after the loop.&lt;/p&gt;

&lt;p&gt;Now let’s try the same thing with an array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{:?}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no compiler error this time. Why?&lt;/p&gt;

&lt;p&gt;The type of &lt;code&gt;num&lt;/code&gt; is &lt;code&gt;[i32; 3]&lt;/code&gt;. Since &lt;code&gt;i32&lt;/code&gt; implements &lt;code&gt;Copy&lt;/code&gt;, the array also implements &lt;code&gt;Copy&lt;/code&gt;. That means &lt;code&gt;num&lt;/code&gt; is copied into the loop instead of being moved, and the original array remains available after the loop. &lt;/p&gt;

&lt;p&gt;Now consider an array of &lt;code&gt;String&lt;/code&gt;s:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;strs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"one"&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;"two"&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;()];&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;strs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{:?}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// compiler error: value borrowed here after move&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This produces the same compiler error as the &lt;code&gt;Vec&lt;/code&gt; example.&lt;/p&gt;

&lt;p&gt;The reason is that &lt;code&gt;String&lt;/code&gt; does not implement &lt;code&gt;Copy&lt;/code&gt;. As a result&lt;code&gt;[String; 2]&lt;/code&gt; is also not &lt;code&gt;Copy&lt;/code&gt;. When the array is passed to &lt;code&gt;into_iter&lt;/code&gt;, it is &lt;strong&gt;moved&lt;/strong&gt; into the iterator, making &lt;code&gt;strs&lt;/code&gt; unavailable afterward.&lt;/p&gt;

&lt;p&gt;So how does Rust know that some arrays are &lt;code&gt;Copy&lt;/code&gt; while others are not?&lt;/p&gt;

&lt;p&gt;This isn’t compiler magic. It’s implemented in the standard library with a &lt;a href="https://doc.rust-lang.org/src/core/array/mod.rs.html#443" rel="noopener noreferrer"&gt;blanket implementation&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;impl&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Copy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Copy&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This implementation says:&lt;/p&gt;

&lt;p&gt;For any type &lt;code&gt;T&lt;/code&gt; that implements &lt;code&gt;Copy&lt;/code&gt;, and for any array length &lt;code&gt;N&lt;/code&gt;, the array &lt;code&gt;[T; N]&lt;/code&gt; also implements &lt;code&gt;Copy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As a result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;[i32; 3]&lt;/code&gt; is &lt;code&gt;Copy&lt;/code&gt; because &lt;code&gt;i32&lt;/code&gt; is &lt;code&gt;Copy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[bool; 10]&lt;/code&gt; is &lt;code&gt;Copy&lt;/code&gt; because &lt;code&gt;bool&lt;/code&gt; is &lt;code&gt;Copy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;[String; 2]&lt;/code&gt; is &lt;strong&gt;not&lt;/strong&gt; &lt;code&gt;Copy&lt;/code&gt; because &lt;code&gt;String&lt;/code&gt; is not &lt;code&gt;Copy&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, whether an array implements &lt;code&gt;Copy&lt;/code&gt; depends entirely on whether its element type implements &lt;code&gt;Copy&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>learningrust</category>
    </item>
    <item>
      <title>Understanding `&amp;mut &amp;'a self` Calls on Temporaries in Rust</title>
      <dc:creator>Jazz Thumyat 🦀</dc:creator>
      <pubDate>Fri, 26 Jun 2026 13:25:04 +0000</pubDate>
      <link>https://dev.to/jazz_thumyat/understanding-mut-self-calls-on-temporaries-in-rust-5bm2</link>
      <guid>https://dev.to/jazz_thumyat/understanding-mut-self-calls-on-temporaries-in-rust-5bm2</guid>
      <description>&lt;p&gt;&lt;code&gt;[T]&lt;/code&gt; has the following &lt;code&gt;split_off&lt;/code&gt; method. Notice that its receiver type is &lt;code&gt;&amp;amp;mut &amp;amp;'a Self&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;split_off&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;OneSidedRange&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now look at this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="nf"&gt;.as_slice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.split_off&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nf"&gt;.as_slice&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This may look confusing at first.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;v.as_slice()&lt;/code&gt; returns &lt;code&gt;&amp;amp;[i32]&lt;/code&gt;, but &lt;code&gt;split_off()&lt;/code&gt; expects &lt;code&gt;&amp;amp;mut &amp;amp;[i32]&lt;/code&gt;. So where does the mutable reference come from?&lt;/p&gt;

&lt;p&gt;The answer is that &lt;code&gt;v.as_slice()&lt;/code&gt; creates a &lt;strong&gt;temporary&lt;/strong&gt; value. In Rust, a temporary is a mutable place, so the compiler can automatically borrow it as &lt;code&gt;&amp;amp;mut&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can think of the code as if the compiler had written this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="nf"&gt;.as_slice&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="nf"&gt;.split_off&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mutable reference is taken to the temporary variable (&lt;code&gt;temp&lt;/code&gt;), not to the original vector or slice. The vector &lt;code&gt;v&lt;/code&gt; and the slice it produces are never mutated. Only the temporary variable is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof that temporaries are mutable places
&lt;/h2&gt;

&lt;p&gt;A normal &lt;code&gt;let&lt;/code&gt; binding is &lt;strong&gt;immutable&lt;/strong&gt; unless you write &lt;code&gt;mut&lt;/code&gt;. Because of that, the following code does &lt;strong&gt;not&lt;/strong&gt; compile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="nf"&gt;.as_slice&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// no `mut`&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="nf"&gt;.split_off&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;     &lt;span class="c1"&gt;// compiler error here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The compiler reports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error[E0596]: cannot borrow `s` as mutable, as it is not declared as mutable
13 |     let _ = s.split_off(..2);
   |             ^ cannot borrow as mutable
help: consider changing this to be mutable
12 |     let mut s: &amp;amp;[i32] = v.as_slice();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This shows the difference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;let s: &amp;amp;[i32] = v.as_slice()&lt;/code&gt; creates an immutable place, so Rust cannot take &lt;code&gt;&amp;amp;mut s&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;v.as_slice()&lt;/code&gt; creates a temporary, and a temporary is a mutable place, so Rust can automatically take &lt;code&gt;&amp;amp;mut&lt;/code&gt; to call &lt;code&gt;split_off()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why &lt;code&gt;v.as_slice().split_off(..2)&lt;/code&gt; compiles, while &lt;code&gt;s.split_off(..2)&lt;/code&gt; does not unless &lt;code&gt;s&lt;/code&gt; is declared with &lt;code&gt;mut&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>learningrust</category>
    </item>
    <item>
      <title>Expected Option&lt;String&gt;, Got Option&lt;()&gt; — Here's Why</title>
      <dc:creator>Jazz Thumyat 🦀</dc:creator>
      <pubDate>Thu, 25 Jun 2026 04:24:16 +0000</pubDate>
      <link>https://dev.to/jazz_thumyat/expected-option-got-option-heres-why-5495</link>
      <guid>https://dev.to/jazz_thumyat/expected-option-got-option-heres-why-5495</guid>
      <description>&lt;p&gt;I'm learning Rust and recently ran into something unexpected with &lt;code&gt;Option&lt;/code&gt; type. I expected &lt;code&gt;r&lt;/code&gt; to be &lt;code&gt;Option&amp;lt;&amp;amp;mut String&amp;gt;&lt;/code&gt;, but it came back as &lt;code&gt;Option&amp;lt;()&amp;gt;&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;Here's what I tried:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;vds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;VecDeque&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="nf"&gt;.to_owned&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="nf"&gt;.to_owned&lt;/span&gt;&lt;span class="p"&gt;()]);&lt;/span&gt;  
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vds&lt;/span&gt;  
    &lt;span class="nf"&gt;.get_mut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="nf"&gt;.and_then&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It turned out to be a fundamental Rust concept: assignment is an expression, and it always evaluates to &lt;code&gt;()&lt;/code&gt;, the empty unit type.&lt;/p&gt;

&lt;p&gt;Here's why: &lt;code&gt;*v = String::from("Hello")&lt;/code&gt; is an assignment, so it evaluates to &lt;code&gt;()&lt;/code&gt;. &lt;code&gt;Some()&lt;/code&gt; wraps that unit value, giving us &lt;code&gt;Some(())&lt;/code&gt;. That's why &lt;code&gt;r&lt;/code&gt; ends up as &lt;code&gt;Option&amp;lt;()&amp;gt;&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>learningrust</category>
    </item>
  </channel>
</rss>
