<?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>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>
