<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Rust on My Little Blog</title><link>https://www.parkerchenca.com/tags/rust/</link><description>Recent content in Rust on My Little Blog</description><generator>Hugo</generator><language>en-us</language><copyright>Parker Chen</copyright><lastBuildDate>Thu, 10 Sep 2026 11:26:00 +0000</lastBuildDate><atom:link href="https://www.parkerchenca.com/tags/rust/index.xml" rel="self" type="application/rss+xml"/><item><title>Result and Option in short</title><link>https://www.parkerchenca.com/tech/result-and-option-in-short/</link><pubDate>Thu, 10 Sep 2026 11:26:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/result-and-option-in-short/</guid><description>Two old friends in Rust</description><content:encoded><![CDATA[<blockquote>
<p>🔔 <strong>Prelude:</strong>
When writing Rust programs, Result and Option are data structures we can hardly avoid. I believe that rather than understanding their underlying mechanisms, we should first quickly figure out how to handle them.</p>
</blockquote>
<h2 id="gift-wrapping">Gift Wrapping</h2>
<p>Actually, we don&rsquo;t need to think of <code>Option&lt;T&gt;</code> and <code>Result&lt;T,E&gt;</code> as too complicated:</p>
<ul>
<li><code>Option</code> contains the data we want, where the data type is <code>T</code>. However, there might be no data inside (<code>None</code>). But regardless, as long as what we care about is wrapped, it <strong>will be</strong> an <code>Option</code>.</li>
<li><code>Result</code> also contains the data we want, but it comes with another &ldquo;restless&rdquo; additional item <code>E</code> (Error). In fact, combinations of Result and Option are very common, such as <code>Result&lt;Option&lt;T&gt;, E&gt;</code>. <code>Result</code> provides a powerful and <strong>unified</strong> specification for Rust&rsquo;s error handling.</li>
</ul>
<h3 id="so-how-do-we-open-the-gift-box">So, how do we open the gift box&hellip;</h3>
<p>The moment of unwrapping gifts is always exciting.</p>
<p>Whether it&rsquo;s <code>Option</code> or <code>Result</code>, we can use <code>unwrap()</code> to open this package.</p>
<ul>
<li>If the gift box contains a normal value, everything goes smoothly, and everyone&rsquo;s happy.</li>
<li>But if it contains something &ldquo;weird&rdquo; (<code>None</code> or <code>Err</code>), the program will immediately <code>panic</code> and crash.</li>
</ul>
<p>Of course, if we insist on using safer unwrapping methods (like <code>unwrap_or</code>, <code>match</code>, etc.), we can control whether the program crashes ourselves, which is very practical.</p>
<h3 id="what-functions-do-these-gift-boxes-provide">What functions do these gift boxes provide?</h3>
<p>Let&rsquo;s quickly go through the methods they provide. Detailed explanations won&rsquo;t be provided here, as I believe you can look up relevant information through <a href="https://doc.rust-lang.org/std/option/">https://doc.rust-lang.org/std/option/</a> and <a href="https://doc.rust-lang.org/std/result/">https://doc.rust-lang.org/std/result/</a>.</p>
<h4 id="option">Option</h4>
<table>
	<thead>
			<tr>
					<th>API</th>
					<th>Purpose</th>
					<th>Return Value and Notes</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>is_some()</code></td>
					<td>Check if it&rsquo;s <code>Some</code></td>
					<td><code>bool</code></td>
			</tr>
			<tr>
					<td><code>is_none()</code></td>
					<td>Check if it&rsquo;s <code>None</code></td>
					<td><code>bool</code></td>
			</tr>
			<tr>
					<td><code>unwrap()</code></td>
					<td>Get the value inside <code>Some</code>, panic if <code>None</code></td>
					<td><code>T</code> / <code>panic</code></td>
			</tr>
			<tr>
					<td><code>unwrap_or(default)</code></td>
					<td>Get value, return specified default if <code>None</code></td>
					<td><code>T</code></td>
			</tr>
			<tr>
					<td><code>unwrap_or_else(f)</code></td>
					<td>Get value, call closure <code>f</code> to return default if <code>None</code></td>
					<td><code>T</code></td>
			</tr>
			<tr>
					<td><code>map(f)</code></td>
					<td>If <code>Some</code>, call <code>f</code> on inner value, return new <code>Option</code></td>
					<td><code>Option&lt;U&gt;</code></td>
			</tr>
			<tr>
					<td><code>and_then(f)</code></td>
					<td>If <code>Some</code>, call <code>f</code>, return another <code>Option</code></td>
					<td><code>Option&lt;U&gt;</code></td>
			</tr>
			<tr>
					<td><code>or(other)</code></td>
					<td>If <code>None</code>, return parameter <code>other</code>, otherwise return self</td>
					<td><code>Option&lt;T&gt;</code></td>
			</tr>
			<tr>
					<td><code>or_else(f)</code></td>
					<td>If <code>None</code>, call closure <code>f</code> to return an <code>Option</code></td>
					<td><code>Option&lt;T&gt;</code></td>
			</tr>
			<tr>
					<td><code>as_ref()</code></td>
					<td>Convert <code>Option&lt;T&gt;</code> to immutable reference of inner value <code>Option&lt;&amp;T&gt;</code></td>
					<td><code>Option&lt;&amp;T&gt;</code></td>
			</tr>
			<tr>
					<td><code>as_mut()</code></td>
					<td>Convert <code>Option&lt;T&gt;</code> to mutable reference of inner value <code>Option&lt;&amp;mut T&gt;</code></td>
					<td><code>Option&lt;&amp;mut T&gt;</code></td>
			</tr>
			<tr>
					<td><code>ok_or(err)</code></td>
					<td>Convert <code>Some(value)</code> to <code>Ok(value)</code>, and <code>None</code> to <code>Err(err)</code></td>
					<td><code>Result&lt;T, E&gt;</code></td>
			</tr>
			<tr>
					<td><code>ok_or_else(f)</code></td>
					<td>Same as above, but call closure if <code>None</code></td>
					<td><code>Result&lt;T, E&gt;</code></td>
			</tr>
			<tr>
					<td><code>expect(msg)</code></td>
					<td>Similar to <code>unwrap()</code>, but allows custom error message</td>
					<td><code>T</code> / <code>panic</code></td>
			</tr>
			<tr>
					<td><code>?</code></td>
					<td>Return <code>None</code> directly when <code>None</code> (must be used in functions returning <code>Option</code>)</td>
					<td><code>T</code> / early return</td>
			</tr>
	</tbody>
</table>
<p>Notable methods:</p>
<ul>
<li><code>map(f)</code> provides a way to operate on inner data without unpacking, very commonly used</li>
<li><code>expect(&quot;Hi&quot;)</code> can display error messages when panicking, more practical than <code>unwrap()</code></li>
<li><code>?</code> can greatly improve code cleanliness</li>
<li><code>is_some()</code> and <code>is_none()</code> are also very useful for making decisions</li>
</ul>
<h3 id="result">Result</h3>
<p>Compared to the intuitive and easy-to-understand <code>Option</code>, <code>Result</code> seems more &ldquo;convoluted&rdquo; with an additional type, but essentially it&rsquo;s almost identical to <code>Option</code>: what to do if we didn&rsquo;t get the value (possibly due to an error).</p>
<table>
	<thead>
			<tr>
					<th>API</th>
					<th>Purpose</th>
					<th>Return Value / Notes</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><code>is_ok()</code></td>
					<td>Check if it&rsquo;s <code>Ok</code></td>
					<td><code>bool</code></td>
			</tr>
			<tr>
					<td><code>is_err()</code></td>
					<td>Check if it&rsquo;s <code>Err</code></td>
					<td><code>bool</code></td>
			</tr>
			<tr>
					<td><code>unwrap()</code></td>
					<td>Get value inside <code>Ok</code>, <code>panic</code> if <code>Err</code></td>
					<td><code>T</code> / <code>panic</code></td>
			</tr>
			<tr>
					<td><code>unwrap_or(default)</code></td>
					<td>Get value, return default if <code>Err</code></td>
					<td><code>T</code></td>
			</tr>
			<tr>
					<td><code>unwrap_or_else(f)</code></td>
					<td>Get value, call closure <code>f</code> to return default if <code>Err</code></td>
					<td><code>T</code></td>
			</tr>
			<tr>
					<td><code>map(f)</code></td>
					<td>If <code>Ok</code>, call <code>f</code> on inner value, return new <code>Result</code></td>
					<td><code>Result&lt;U, E&gt;</code></td>
			</tr>
			<tr>
					<td><code>and_then(f)</code></td>
					<td>If <code>Ok</code>, call <code>f</code>, return another <code>Result</code></td>
					<td><code>Result&lt;U, E&gt;</code></td>
			</tr>
			<tr>
					<td><code>map_err(f)</code></td>
					<td>If <code>Err</code>, call <code>f</code> on error, return new <code>Result</code></td>
					<td><code>Result&lt;T, F&gt;</code></td>
			</tr>
			<tr>
					<td><code>or(other)</code></td>
					<td>If <code>Err</code>, return <code>other</code>, otherwise return self</td>
					<td><code>Result&lt;T, E&gt;</code></td>
			</tr>
			<tr>
					<td><code>or_else(f)</code></td>
					<td>If <code>Err</code>, call closure <code>f</code> to return <code>Result</code></td>
					<td><code>Result&lt;T, E&gt;</code></td>
			</tr>
			<tr>
					<td><code>as_ref()</code></td>
					<td>Convert to immutable references</td>
					<td><code>Result&lt;&amp;T, &amp;E&gt;</code></td>
			</tr>
			<tr>
					<td><code>as_mut()</code></td>
					<td>Convert to mutable references</td>
					<td><code>Result&lt;&amp;mut T, &amp;mut E&gt;</code></td>
			</tr>
			<tr>
					<td><code>ok()</code></td>
					<td>Success value → <code>Some(value)</code>, error → <code>None</code></td>
					<td><code>Option&lt;T&gt;</code></td>
			</tr>
			<tr>
					<td><code>err()</code></td>
					<td>Error value → <code>Some(error)</code>, success → <code>None</code></td>
					<td><code>Option&lt;E&gt;</code></td>
			</tr>
			<tr>
					<td><code>expect(msg)</code></td>
					<td>Similar to <code>unwrap()</code>, but allows custom error message</td>
					<td><code>T</code> / <code>panic</code></td>
			</tr>
			<tr>
					<td><code>?</code></td>
					<td>Return early when encountering <code>Err</code> (must be used in functions returning <code>Result</code>)</td>
					<td><code>T</code> / early return</td>
			</tr>
	</tbody>
</table>
<p><code>Result</code> also has: <code>map(f)</code> and <code>?</code>, as well as useful <code>is_ok()</code> and <code>is_err()</code></p>
<p>In <code>Result&lt;T, E&gt;</code>:</p>
<ul>
<li><code>T</code> is the type of value returned on success (e.g., file content, calculation result, etc.).</li>
<li><code>E</code> is the type of value returned on error (e.g., <code>std::io::Error</code>, custom error <code>enum</code>, etc.).</li>
<li>Actually:
<ul>
<li><code>E</code> can be any type, with no restrictions</li>
<li>But to use <code>?</code>, facilitate debugging and printing, <code>E</code> usually needs to implement <code>Debug</code>, <code>Display</code>, <code>Error</code>, and other traits</li>
<li>Yes, <code>E</code> can be very complex types (carrying context, providing helper methods), or very simple error structures (like, a string). <code>Err</code> is just the shell that <code>Result</code> uses to mark &ldquo;this is the error branch&rdquo;, with <code>E</code> inside</li>
</ul>
</li>
</ul>
<h3 id="examples">Examples</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="c1">// ===== Creating Option =====
</span></span></span><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">some_value</span>: <span class="nb">Option</span><span class="o">&lt;</span><span class="kt">i32</span><span class="o">&gt;</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span><span class="w">  </span><span class="c1">// Has value
</span></span></span><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">none_value</span>: <span class="nb">Option</span><span class="o">&lt;</span><span class="kt">i32</span><span class="o">&gt;</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">None</span><span class="p">;</span><span class="w">      </span><span class="c1">// No value
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Common usage: returning from functions
</span></span></span><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">find_number</span><span class="p">(</span><span class="n">flag</span>: <span class="kt">bool</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;</span><span class="kt">i32</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="n">flag</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nb">None</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// ===== Creating Result =====
</span></span></span><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">ok_value</span>: <span class="nb">Result</span><span class="o">&lt;</span><span class="kt">i32</span><span class="p">,</span><span class="w"> </span><span class="nb">String</span><span class="o">&gt;</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Ok</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span><span class="w">                    </span><span class="c1">// Success
</span></span></span><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">err_value</span>: <span class="nb">Result</span><span class="o">&lt;</span><span class="kt">i32</span><span class="p">,</span><span class="w"> </span><span class="nb">String</span><span class="o">&gt;</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Err</span><span class="p">(</span><span class="s">&#34;Oops&#34;</span><span class="p">.</span><span class="n">to_string</span><span class="p">());</span><span class="w"> </span><span class="c1">// Failure
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// Common usage: returning from functions
</span></span></span><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">divide</span><span class="p">(</span><span class="n">a</span>: <span class="kt">i32</span><span class="p">,</span><span class="w"> </span><span class="n">b</span>: <span class="kt">i32</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Result</span><span class="o">&lt;</span><span class="kt">i32</span><span class="p">,</span><span class="w"> </span><span class="nb">String</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nb">Err</span><span class="p">(</span><span class="s">&#34;Division by zero&#34;</span><span class="p">.</span><span class="n">to_string</span><span class="p">())</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nb">Ok</span><span class="p">(</span><span class="n">a</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>]]></content:encoded></item><item><title>Rust Notes 4</title><link>https://www.parkerchenca.com/tech/rust-notes-4/</link><pubDate>Thu, 10 Sep 2026 11:19:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/rust-notes-4/</guid><description>Range</description><content:encoded><![CDATA[<h2 id="range">Range</h2>
<p>Rather than using C style loop, in Rust, we use ..= to indicate a range:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">for</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="mi">1</span><span class="o">..=</span><span class="mi">5</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="fm">println!</span><span class="p">(</span><span class="s">&#34;</span><span class="si">{}</span><span class="s">&#34;</span><span class="p">,</span><span class="n">i</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>Output:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="mi">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="mi">2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="mi">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="mi">4</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="mi">5</span><span class="w">
</span></span></span></code></pre></div><p>Sequences are only allowed for numeric or character types because they can be consecutive.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">for</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="sc">&#39;a&#39;</span><span class="o">..=</span><span class="sc">&#39;z&#39;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="fm">println!</span><span class="p">(</span><span class="s">&#34;</span><span class="si">{}</span><span class="s">&#34;</span><span class="p">,</span><span class="n">i</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="char">Char</h3>
<p>Use <code>''</code> . <code>&quot;&quot;</code> is for the string</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sc">&#39;z&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">z</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sc">&#39;ℤ&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">cat</span><span class="o">=</span><span class="w"> </span><span class="sc">&#39;😻&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>Accept <code>Unicode</code>, occupy 4 bytes.</p>
<h3 id="bool">Bool</h3>
<p>Only 1 byte.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">f</span>: <span class="kt">bool</span> <span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="unit-type">Unit type</h3>
<p>Literally, it is <code>()</code>.</p>
<p>Yes, the unit type is <code>()</code>, and the value of this type is also, and only <code>()</code>.</p>
<p>It&rsquo;s similar to <code>void</code> in other languages.</p>
<p>Sometimes, you may come across code like <code>Result&lt;(), String&gt;</code>. This is an example of <strong>generic types</strong> in Rust. If you&rsquo;re familiar with C++ generic types, you can figure out that we pass 2 types into the <code>Result</code>, regardless of what the <code>Result</code> actually is.</p>
]]></content:encoded></item><item><title>Rust Notes 3</title><link>https://www.parkerchenca.com/tech/rust-notes-3/</link><pubDate>Thu, 10 Sep 2026 11:16:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/rust-notes-3/</guid><description>Basic types 1</description><content:encoded><![CDATA[<blockquote>
<p>🔔 <strong>Prelude:</strong>
In the end, all data types in Rust come from these primitive types.</p>
</blockquote>
<h2 id="basic-types">Basic types</h2>
<ul>
<li>Every value in Rust has a specific data type</li>
<li>In general, these can be divided into two categories: <strong>scalar</strong> types and <strong>compound</strong> types</li>
<li>Scalar types include:
<ul>
<li><strong>Numbers</strong>: Signed integers (<code>i8</code>, <code>i16</code>, <code>i32</code>, <code>i64</code>, <code>isize</code>), unsigned integers (<code>u8</code>, <code>u16</code>, <code>u32</code>, <code>u64</code>, <code>usize</code>), floating-point numbers (<code>f32</code>, <code>f64</code>)
<ul>
<li>The <code>isize</code> and <code>usize</code> types depend on the architecture of the computer the program is running on: if the CPU is 32-bit, these types are 32-bit; similarly, if the CPU is 64-bit, they are</li>
<li>Rust&rsquo;s <strong>default</strong> integer type is <code>i32</code></li>
<li>Can overflow, and Rust does not check for this by default. If you encounter incorrect values, make sure to check the type of your numbers.</li>
</ul>
</li>
<li><strong>Strings</strong>: String literals and string slices</li>
<li><strong>Booleans</strong>: <code>true</code> and <code>false</code></li>
<li><strong>Characters</strong>: Representing a single Unicode character, stored as 4 bytes</li>
<li><strong>Unit type</strong>: Represented by <code>()</code>, with its only value also being <code>()</code></li>
</ul>
</li>
</ul>
<hr>
<h3 id="be-careful-with-floats">Be Careful with <code>float</code>s</h3>
<p>See this example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="fm">assert!</span><span class="p">(</span><span class="mf">0.1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mf">0.3</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>You might think this would return <code>true</code> , but the truth is, the program will panic and quit.</p>
<ul>
<li>Due to binary precision issues, <code>0.1 + 0.2</code> is not exactly equal to <code>0.3</code></li>
<li>You can consider using this approach: <code>(0.1_f64 + 0.2 - 0.3).abs() &lt; 0.00001</code></li>
</ul>
<hr>
<h3 id="nan">NaN</h3>
<ul>
<li><code>-42.1.sqrt()</code> will produce <code>NaN</code></li>
<li>Any operation involving <code>NaN</code> will return <code>NaN</code></li>
<li>Comparing <code>NaN</code> will cause the code to panic and crash</li>
<li>Use <code>is_nan()</code> to determine if a value is <code>NaN</code></li>
</ul>
<hr>
<h3 id="use"><strong>Use <code>as</code> for Type Conversion</strong></h3>
<p>In Rust, you can use <code>as</code> to convert one type to another.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">x</span>: <span class="kt">i32</span> <span class="o">=</span><span class="w"> </span><span class="mi">10</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">y</span>: <span class="kt">f64</span> <span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">f64</span><span class="p">;</span><span class="w"> </span><span class="c1">// Convert i32 to f64
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="fm">println!</span><span class="p">(</span><span class="s">&#34;x as f64 is: </span><span class="si">{}</span><span class="s">&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>]]></content:encoded></item><item><title>Rust Notes 2</title><link>https://www.parkerchenca.com/tech/rust-notes-2/</link><pubDate>Thu, 10 Sep 2026 11:15:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/rust-notes-2/</guid><description>Basic syntax: variable and function</description><content:encoded><![CDATA[<h2 id="syntax-of-rust">Syntax of Rust</h2>
<p>Don’t worry, this will be very easy at the beginning. (Really?)</p>
<hr>
<h3 id="function-goes-first">Function goes first</h3>
<ul>
<li>Similar to C and C++, there must be a <code>main</code> function as the entry point of the program.</li>
<li>Use <code>fn</code> to declare a function, so concise.</li>
<li>Use <code>()</code> for receiving parameters, and <code>{}</code> for the actual logic inside the function.</li>
<li>Remember to use <code>;</code> to end a statement. As I said, it’s similar to C and C++.</li>
<li>Example:</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span>-&gt; <span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="fm">println!</span><span class="p">(</span><span class="s">&#34;Hello, world!&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// &#34;ln&#34; means print with a new line after the content
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// What is &#34;!&#34;? Well, it means this function is actually a macro
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// For now, let&#39;s just use it as is
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// You don&#39;t need to learn everything to start using Rust. Heart.
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>A complete structure of function head in Rust should be:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="n">keyword</span><span class="w"> </span><span class="n">name</span><span class="p">(</span><span class="n">parameter</span>: <span class="nc">type</span><span class="w"> </span><span class="p">)</span><span class="w"> </span>-&gt; <span class="p">[</span><span class="k">return</span><span class="w"> </span><span class="k">type</span><span class="p">]</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">body</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">fn</span>      <span class="nf">myFunction</span><span class="p">(</span><span class="n">para</span><span class="w"> </span>: <span class="kt">i32</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="kt">i32</span> <span class="p">{</span><span class="w"> </span><span class="o">..</span><span class="p">.</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><hr>
<h3 id="define-variables">Define variables</h3>
<ul>
<li>You <strong>must</strong> use <code>let</code> to create a variable.
<ul>
<li><code>let myVar = 3;</code></li>
<li><code>let myVar: u32 = 3;</code> → Explicitly specifies the type of the variable <code>myVar</code> as <code>u32</code>. <code>u32</code> is a 32-bit unsigned integer type in Rust.</li>
<li><code>let mut myVar = 3;</code> → Creates a <strong>mutable</strong> variable.</li>
</ul>
</li>
<li>What? Mutable?
<ul>
<li>Variables in Rust are <strong>immutable by default</strong>.(Its value is determined after compilation.)</li>
<li>It&rsquo;s important to understand that in Rust, <code>some_variable = some_value</code> is not just <strong>assigning</strong> a value, but rather <strong>binding</strong> the value to the variable.</li>
<li>This topic is related to Rust’s Ownership feature, which we will discuss in the next post.</li>
<li>Here&rsquo;s an example:</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="n">myVar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">myVar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">6</span><span class="p">;</span><span class="w"> </span><span class="c1">// Error
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">myMutVar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">myMutVar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">6</span><span class="p">;</span><span class="w"> </span><span class="c1">// Pass
</span></span></span></code></pre></div><ul>
<li>If you understand that variables are bound to values, it becomes easier to grasp <strong>variable destructuring</strong>:
<ul>
<li>Basically, destructuring means extracting values from patterns.</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">b</span><span class="p">)</span>: <span class="p">(</span><span class="kt">bool</span><span class="p">,</span><span class="kt">bool</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kc">true</span><span class="p">,</span><span class="w"> </span><span class="kc">false</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="fm">println!</span><span class="p">(</span><span class="s">&#34;a = </span><span class="si">{:?}</span><span class="s">, b = </span><span class="si">{:?}</span><span class="s">&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// You can treat the {} as a placeholder for a or b
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// :? is for &#34;formatting&#34; output and &#34;debugging&#34; output
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Whatever, it should print the value of a and b
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="fm">assert_eq!</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>You can also use <code>const</code> to define a constant value:
<ul>
<li><code>const MY_CONST_VALUE: i32 = 5;</code></li>
<li>Constants must always have a type annotation, unlike regular variables.</li>
</ul>
</li>
</ul>
<hr>
<h4 id="statement-and-expression"><strong>Statement and expression</strong></h4>
<ul>
<li>In short:</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">fn</span> <span class="nf">add_with_extra</span><span class="p">(</span><span class="n">x</span>: <span class="kt">i32</span><span class="p">,</span><span class="w"> </span><span class="n">y</span>: <span class="kt">i32</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="kt">i32</span>  <span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// Statement
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">let</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">5</span><span class="p">;</span><span class="w"> </span><span class="c1">// Statement
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="n">x</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="c1">// Expression. Hey! Attention here! No &#34;;&#34; after the sentence!
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// Also expression is expected to &#34;return&#34; something
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// So we can avoid to write &#34;return&#34; in the end of our fn
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// In other word, statament CANNOT return a value
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>Interesting facts:
<ul>
<li>In <code>let x = 1;</code>
<ul>
<li><code>x</code> is an expression</li>
<li><code>1</code> is an expression</li>
<li><code>let x = 1;</code> is a statement</li>
<li>Bound</li>
</ul>
</li>
</ul>
</li>
<li>Lastly, if an expression doesn’t return anything, it returns <code>()</code>
<ul>
<li><code>()</code> is both a type and a value, and the value is <code>()</code>.</li>
<li>You can treat the <code>()</code> as a <code>()</code>, yes, that is it.</li>
</ul>
</li>
</ul>
]]></content:encoded></item><item><title>Rust Notes 1</title><link>https://www.parkerchenca.com/tech/rust-notes-1/</link><pubDate>Thu, 10 Sep 2026 11:14:00 +0000</pubDate><guid>https://www.parkerchenca.com/tech/rust-notes-1/</guid><description>Hello world!</description><content:encoded><![CDATA[<h2 id="about-these-notes">About these notes</h2>
<p>These Rust notes are just a collection of my learning records. Since I&rsquo;m a beginner in Rust, these notes are more like quick references or supplements, rather than a comprehensive Rust tutorial. No matter what, I hope you can still find parts that are useful to you.</p>
<hr>
<h3 id="why-rust">Why rust？</h3>
<p>Rust&rsquo;s advantages include memory safety, high performance, and high productivity. To me, Rust appears to be one of the best implementations of C++. If you don&rsquo;t get into deeper topics and only use prepared libraries, Rust&rsquo;s syntax is simple and clear. Its built-in compiler cautions are also quite informative, which significantly decreases the amount of thinking required on developers.</p>
<p>However, Rust has been criticized for being &ldquo;too safe.&rdquo; If you want to dig deeper and truly utilize Rust, you&rsquo;ll have to deal with its complex and tedious safety mechanisms. A true dilemma exists: &ldquo;Why not use the more flexible C++, or Python, which offers quicker speed in development and a more strong ecosystem?&rdquo;</p>
<p>In my opinion, Rust is a &ldquo;balanced&rdquo; choice that addresses some shortcomings of mainstream languages. It is safer than C++ and performs better than Python. However, Rust has obvious drawbacks including an extremely high learning and development cost (which may be more difficult than learning C++). However, Rust is clearly a popular technology right now, and its ecosystem is rapidly expanding. Learning a challenging new language is never a terrible idea.</p>
<hr>
<h3 id="environment-prep">Environment prep</h3>
<ol>
<li>Follow the instructions at <a href="https://www.rust-lang.org/learn/get-started">https://www.rust-lang.org/learn/get-started</a> to install <strong>Rust</strong>.</li>
<li>Install VS Code.</li>
<li>Install the <strong>rust-analyzer</strong> extension in VS Code.</li>
<li>Well done! You’re now ready to write your first Rust program.</li>
</ol>
<p>Use Google or AI tools to help you do these tasks, you will deal with Google and AI all the time when you’re learning something new.</p>
<hr>
<h3 id="hello-world">Hello world</h3>
<ol>
<li>In VS Code, open a new folder.</li>
<li>Press `Ctrl + `` to open a new terminal, or you can follow the top menu tabs: &ldquo;Terminal&rdquo; -&gt; &ldquo;New Terminal&rdquo;.</li>
<li>Enter <code>cargo new helloworld</code> to create a new project named <code>helloworld</code>.
<ol>
<li><code>cargo</code> is like the <code>pip</code> in Python; it manages packages (libraries) in Rust.</li>
</ol>
</li>
<li>Go into the <code>src</code> folder, and you will find the <code>main.rs</code> file.</li>
<li>Enter <code>cargo run</code> in the terminal to directly run … oops! An error occurs.
<ol>
<li>You need to first navigate into the <code>helloworld</code> directory because that’s the project’s working directory.</li>
<li>Use <code>cd helloworld</code>, or open the folder again in VS Code, and then create a new terminal.</li>
<li>Enter <code>cargo run</code>.</li>
<li>Congratulations! You&rsquo;ve run your first Rust program!</li>
</ol>
</li>
</ol>
]]></content:encoded></item></channel></rss>