<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="/assets/rss-20b3285f.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>标签: Rust - ouuan's blog</title>
        <link>https://ouuan.moe/tag/Rust</link>
        <description>标签为 Rust 的文章 - ouuan 的博客</description>
        <lastBuildDate>Mon, 15 Aug 2022 15:11:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>Copyright © 2022 - 2026 ouuan
Licensed under CC BY-SA 4.0</copyright>
        <atom:link href="https://ouuan.moe/tag/Rust/feed.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[初学 Rust]]></title>
            <link>https://ouuan.moe/post/2022/08/learn-rust</link>
            <guid>https://ouuan.moe/post/2022/08/learn-rust</guid>
            <pubDate>Mon, 15 Aug 2022 15:11:45 GMT</pubDate>
            <description><![CDATA[

<p>早就想学 Rust 了<span class="mojikumi-line-end">，</span>但一直咕着<span class="mojikumi-line-end">。</span>这次小学期的程设训练开了 Rust 课堂<span class="mojikumi-line-end">，</span>就毫不犹豫地选了<span class="mojikumi-line-end">，</span>也以此为契机学了 Rust<span class="mojikumi-line-end">。</span></p>
<p>这篇就是简单记录一下大体上的学习过程<span class="mojikumi-line-end">，</span>如果有什么心得体会<span class="mojikumi-line-end">、</span>经验分享之类应该会开新的文章<span class="mojikumi-line-end">。</span></p>
<p>顺便也算是程设训练的游记了（<span class="mojikumi">“</span>游记<span class="mojikumi-line-end">”</span>这个词来源于 OI 时期的习惯<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
]]></description>
            <content:encoded><![CDATA[

<p>早就想学 Rust 了<span class="mojikumi-line-end">，</span>但一直咕着<span class="mojikumi-line-end">。</span>这次小学期的程设训练开了 Rust 课堂<span class="mojikumi-line-end">，</span>就毫不犹豫地选了<span class="mojikumi-line-end">，</span>也以此为契机学了 Rust<span class="mojikumi-line-end">。</span></p>
<p>这篇就是简单记录一下大体上的学习过程<span class="mojikumi-line-end">，</span>如果有什么心得体会<span class="mojikumi-line-end">、</span>经验分享之类应该会开新的文章<span class="mojikumi-line-end">。</span></p>
<p>顺便也算是程设训练的游记了（<span class="mojikumi">“</span>游记<span class="mojikumi-line-end">”</span>这个词来源于 OI 时期的习惯<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>

<h2 id="初学------the-rust-programming-language" class="heading"><a href="#初学------the-rust-programming-language" class="heading-anchor" aria-label="章节： 初学 —— The Rust Programming Language" tabindex="-1"></a><span>初学 —— The Rust Programming Language</span></h2>
<p>不同于 Python<span class="mojikumi-line-end">、</span>JavaScript<span class="mojikumi-line-end">，</span>这次学 Rust 更像是当初学 C++<span class="mojikumi-line-end">，</span>不是先魔改代码<span class="mojikumi-line-end">、</span>用啥搜啥<span class="mojikumi-line-end">、</span>StackOverflow<span class="mojikumi-line-end">，</span>而是在还没怎么接触过时就直接看书<span class="mojikumi-line-end">。</span></p>
<p>虽然没有细看中文翻译的质量如何<span class="mojikumi-line-end">，</span>但至少术语是不好翻译的<span class="mojikumi-line-end">，</span>就直接看了英文版的 <a href="https://doc.rust-lang.org/book/">The Rust Programming Language</a><span class="mojikumi-line-end">。</span></p>
<p>这本书看下来给我的感觉是<span class="mojikumi-line-end">，</span>很多地方没有按知识点依赖关系的拓扑排序来讲<span class="mojikumi-line-end">，</span>而似乎是以某种由浅入深的顺序来的<span class="mojikumi-line-end">，</span>很多后面才学到的概念在前文就出现<span class="mojikumi-line-end">，</span>而前面学的概念的完全不需要后面知识的扩展又在后面才补充<span class="mojikumi-line-end">，</span>还有一些零碎的知识是在 project chapter 讲的<span class="mojikumi-line-end">。</span></p>
<p>反正<span class="mojikumi-line-end">，</span>每天看两三章<span class="mojikumi-line-end">，</span><s>还能有不少时间摸鱼<span class="mojikumi-line-end">，</span>摸个</s> 一两周就看得差不多了<span class="mojikumi-line-start">（</span></p>
<h2 id="初步练习------洛谷" class="heading"><a href="#初步练习------洛谷" class="heading-anchor" aria-label="章节： 初步练习 —— 洛谷" tabindex="-1"></a><span>初步练习 —— 洛谷</span></h2>
<p>看书的同时在 <a href="https://www.luogu.com.cn/">洛谷</a> 上随便挑了点入门题和板子题写<span class="mojikumi-line-end">。</span>只不过一开始没学 io 之类的<span class="mojikumi-line-end">，</span>会再多语法也做不动题<span class="mojikumi-line-end">，</span><s>但幸好有 GitHub Copilot</s><span class="mojikumi-line-end">。</span></p>
<p>在这放个读入的例子<span class="mojikumi-line-end">：</span></p>
<section class="code-block relative my-6 shadow" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h3 class="text-3 text-footer" aria-label="plain text 代码块" data-v-c675dba6>plain text</h3><ile-root id="ile-1"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-1--></div><div class="dark:hidden" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><samp><span><span style="color: #403f53">6 0</span></span>
<span><span style="color: #403f53">1 1 4 5 1 4</span></span></samp></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><samp><span><span style="color: #d6deeb">6 0</span></span>
<span><span style="color: #d6deeb">1 1 4 5 1 4</span></span></samp></pre></div></section>
<section class="code-block relative my-6 shadow" itemprop="hasPart" itemscope itemtype="https://schema.org/SoftwareSourceCode" data-v-c675dba6><div class="h-6 items-center rd-t-1 bg-area px-4 dark:bg-#2A313A media-screen:important-flex" style="display:none;" data-v-c675dba6><h3 class="text-3 text-footer" itemprop="programmingLanguage" aria-label="Rust 代码块" data-v-c675dba6>Rust</h3><ile-root id="ile-2"><button title="复制到剪贴板" class="copy-button b-footer text-footer" data-v-63dfb2af><span class="i-mdi-content-copy" data-v-63dfb2af></span><span class="sr-only" role="status" data-v-63dfb2af></span></button></ile-root><!--ISLAND_HYDRATION_PLACEHOLDER_ile-2--></div><div class="dark:hidden" itemprop="text" data-v-c675dba6><pre class="shiki light" style="background-color: #FBFBFB" tabindex="0"><code><span><span style="color: #994CC3">fn</span><span style="color: #403F53"> </span><span style="color: #4876D6">main</span><span style="color: #403F53">() {</span></span>
<span><span style="color: #403F53">    </span><span style="color: #994CC3">let</span><span style="color: #403F53"> </span><span style="color: #4876D6">stdin</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> std</span><span style="color: #0C969B">::</span><span style="color: #403F53">io</span><span style="color: #0C969B">::</span><span style="color: #4876D6">stdin</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    </span><span style="color: #994CC3">let</span><span style="color: #403F53"> </span><span style="color: #994CC3">mut</span><span style="color: #403F53"> </span><span style="color: #4876D6">input</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> String</span><span style="color: #0C969B">::</span><span style="color: #4876D6">new</span><span style="color: #403F53">();</span></span>
<span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">stdin</span><span style="color: #0C969B">.</span><span style="color: #4876D6">read_line</span><span style="color: #403F53">(</span><span style="color: #0C969B">&amp;</span><span style="color: #994CC3">mut</span><span style="color: #403F53"> </span><span style="color: #4876D6">input</span><span style="color: #403F53">)</span><span style="color: #0C969B">.</span><span style="color: #4876D6">unwrap</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    </span><span style="color: #994CC3">let</span><span style="color: #403F53"> </span><span style="color: #994CC3">mut</span><span style="color: #403F53"> </span><span style="color: #4876D6">parts</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">input</span><span style="color: #0C969B">.</span><span style="color: #4876D6">split_whitespace</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    </span><span style="color: #994CC3">let</span><span style="color: #403F53"> </span><span style="color: #4876D6">n</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">parts</span><span style="color: #0C969B">.</span><span style="color: #4876D6">next</span><span style="color: #403F53">()</span><span style="color: #0C969B">.</span><span style="color: #4876D6">unwrap</span><span style="color: #403F53">()</span><span style="color: #0C969B">.</span><span style="color: #4876D6">parse</span><span style="color: #0C969B">::</span><span style="color: #403F53">&lt;u32&gt;()</span><span style="color: #0C969B">.</span><span style="color: #4876D6">unwrap</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">assert_eq!</span><span style="color: #403F53">(</span><span style="color: #4876D6">n</span><span style="color: #403F53">, </span><span style="color: #AA0982">6</span><span style="color: #403F53">);</span></span>
<span><span style="color: #403F53">    </span><span style="color: #994CC3">let</span><span style="color: #403F53"> </span><span style="color: #4876D6">m</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">parts</span><span style="color: #0C969B">.</span><span style="color: #4876D6">next</span><span style="color: #403F53">()</span><span style="color: #0C969B">.</span><span style="color: #4876D6">unwrap</span><span style="color: #403F53">()</span><span style="color: #0C969B">.</span><span style="color: #4876D6">parse</span><span style="color: #0C969B">::</span><span style="color: #403F53">&lt;u32&gt;()</span><span style="color: #0C969B">.</span><span style="color: #4876D6">unwrap</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">assert_eq!</span><span style="color: #403F53">(</span><span style="color: #4876D6">m</span><span style="color: #403F53">, </span><span style="color: #AA0982">0</span><span style="color: #403F53">);</span></span>
<span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">input</span><span style="color: #0C969B">.</span><span style="color: #4876D6">clear</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">stdin</span><span style="color: #0C969B">.</span><span style="color: #4876D6">read_line</span><span style="color: #403F53">(</span><span style="color: #0C969B">&amp;</span><span style="color: #994CC3">mut</span><span style="color: #403F53"> </span><span style="color: #4876D6">input</span><span style="color: #403F53">)</span><span style="color: #0C969B">.</span><span style="color: #4876D6">unwrap</span><span style="color: #403F53">();</span></span>
<span><span style="color: #403F53">    </span><span style="color: #994CC3">let</span><span style="color: #403F53"> </span><span style="color: #4876D6">a</span><span style="color: #403F53"> </span><span style="color: #994CC3">=</span><span style="color: #403F53"> </span><span style="color: #4876D6">input</span></span>
<span><span style="color: #403F53">        </span><span style="color: #0C969B">.</span><span style="color: #4876D6">split_whitespace</span><span style="color: #403F53">()</span></span>
<span><span style="color: #403F53">        </span><span style="color: #0C969B">.</span><span style="color: #4876D6">map</span><span style="color: #403F53">(</span><span style="color: #994CC3">|</span><span style="color: #4876D6">x</span><span style="color: #994CC3">|</span><span style="color: #403F53"> </span><span style="color: #4876D6">x</span><span style="color: #0C969B">.</span><span style="color: #4876D6">parse</span><span style="color: #0C969B">::</span><span style="color: #403F53">&lt;i32&gt;()</span><span style="color: #0C969B">.</span><span style="color: #4876D6">unwrap</span><span style="color: #403F53">())</span></span>
<span><span style="color: #403F53">        </span><span style="color: #0C969B">.</span><span style="color: #4876D6">collect</span><span style="color: #0C969B">::</span><span style="color: #403F53">&lt;Vec&lt;</span><span style="color: #4876D6">_</span><span style="color: #403F53">&gt;&gt;();</span></span>
<span><span style="color: #403F53">    </span><span style="color: #4876D6">assert_eq!</span><span style="color: #403F53">(</span><span style="color: #4876D6">a</span><span style="color: #403F53">, </span><span style="color: #4876D6">vec!</span><span style="color: #403F53">[</span><span style="color: #AA0982">1</span><span style="color: #403F53">, </span><span style="color: #AA0982">1</span><span style="color: #403F53">, </span><span style="color: #AA0982">4</span><span style="color: #403F53">, </span><span style="color: #AA0982">5</span><span style="color: #403F53">, </span><span style="color: #AA0982">1</span><span style="color: #403F53">, </span><span style="color: #AA0982">4</span><span style="color: #403F53">]);</span></span>
<span><span style="color: #403F53">}</span></span></code></pre></div><div class="dark:important-block" style="display:none;" data-v-c675dba6><pre class="shiki dark" style="background-color: #011627" tabindex="0"><code><span><span style="color: #C792EA">fn</span><span style="color: #D6DEEB"> </span><span style="color: #82AAFF">main</span><span style="color: #D6DEEB">() {</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C792EA">let</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">stdin</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> std</span><span style="color: #7FDBCA">::</span><span style="color: #D6DEEB">io</span><span style="color: #7FDBCA">::</span><span style="color: #82AAFF">stdin</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C792EA">let</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">mut</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">input</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> String</span><span style="color: #7FDBCA">::</span><span style="color: #82AAFF">new</span><span style="color: #D6DEEB">();</span></span>
<span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">stdin</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">read_line</span><span style="color: #D6DEEB">(</span><span style="color: #7FDBCA">&amp;</span><span style="color: #C792EA">mut</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">input</span><span style="color: #D6DEEB">)</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">unwrap</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C792EA">let</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">mut</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">parts</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">input</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">split_whitespace</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C792EA">let</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">n</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">parts</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">next</span><span style="color: #D6DEEB">()</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">unwrap</span><span style="color: #D6DEEB">()</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">parse</span><span style="color: #7FDBCA">::</span><span style="color: #D6DEEB">&lt;u32&gt;()</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">unwrap</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #82AAFF">assert_eq!</span><span style="color: #D6DEEB">(</span><span style="color: #C5E478">n</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">6</span><span style="color: #D6DEEB">);</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C792EA">let</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">m</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">parts</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">next</span><span style="color: #D6DEEB">()</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">unwrap</span><span style="color: #D6DEEB">()</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">parse</span><span style="color: #7FDBCA">::</span><span style="color: #D6DEEB">&lt;u32&gt;()</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">unwrap</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #82AAFF">assert_eq!</span><span style="color: #D6DEEB">(</span><span style="color: #C5E478">m</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">0</span><span style="color: #D6DEEB">);</span></span>
<span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">input</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">clear</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C5E478">stdin</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">read_line</span><span style="color: #D6DEEB">(</span><span style="color: #7FDBCA">&amp;</span><span style="color: #C792EA">mut</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">input</span><span style="color: #D6DEEB">)</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">unwrap</span><span style="color: #D6DEEB">();</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #C792EA">let</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">a</span><span style="color: #D6DEEB"> </span><span style="color: #C792EA">=</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">input</span></span>
<span><span style="color: #D6DEEB">        </span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">split_whitespace</span><span style="color: #D6DEEB">()</span></span>
<span><span style="color: #D6DEEB">        </span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">map</span><span style="color: #D6DEEB">(</span><span style="color: #C792EA">|</span><span style="color: #C5E478">x</span><span style="color: #C792EA">|</span><span style="color: #D6DEEB"> </span><span style="color: #C5E478">x</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">parse</span><span style="color: #7FDBCA">::</span><span style="color: #D6DEEB">&lt;i32&gt;()</span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">unwrap</span><span style="color: #D6DEEB">())</span></span>
<span><span style="color: #D6DEEB">        </span><span style="color: #7FDBCA">.</span><span style="color: #82AAFF">collect</span><span style="color: #7FDBCA">::</span><span style="color: #D6DEEB">&lt;Vec&lt;</span><span style="color: #C5E478">_</span><span style="color: #D6DEEB">&gt;&gt;();</span></span>
<span><span style="color: #D6DEEB">    </span><span style="color: #82AAFF">assert_eq!</span><span style="color: #D6DEEB">(</span><span style="color: #C5E478">a</span><span style="color: #D6DEEB">, </span><span style="color: #82AAFF">vec!</span><span style="color: #D6DEEB">[</span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">4</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">5</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">1</span><span style="color: #D6DEEB">, </span><span style="color: #F78C6C">4</span><span style="color: #D6DEEB">]);</span></span>
<span><span style="color: #D6DEEB">}</span></span></code></pre></div></section>
<h2 id="复习------a-half-hour-to-learn-rust" class="heading"><a href="#复习------a-half-hour-to-learn-rust" class="heading-anchor" aria-label="章节： 复习 —— A half-hour to learn Rust" tabindex="-1"></a><span>复习 —— A half-hour to learn Rust</span></h2>
<p>之前在 Hacker News 上看到了 <a href="https://fasterthanli.me/articles/a-half-hour-to-learn-rust">A half-hour to learn Rust</a> 这篇文章<span class="mojikumi-line-end">。</span>如果真的是看这个东西来学 Rust<span class="mojikumi-line-end">，</span>不说能不能学会<span class="mojikumi-line-end">，</span>肯定是学不扎实的<span class="mojikumi-line-end">。</span>但是<span class="mojikumi-line-end">，</span>看完书之后很多语法也忘了<span class="mojikumi-line-end">，</span>看这个用来复习还是非常不错的<span class="mojikumi">。</span><wbr><span class="mojikumi-line-start">（</span>另外<span class="mojikumi-line-end">，</span>我感觉这个的顺序貌似比书更有条理一些<span class="mojikumi-line-end">，</span>虽然初学不一定友好 🤔<span class="mojikumi-line-end">）</span></p>
<h2 id="深入了解------the-rust-standard-library" class="heading"><a href="#深入了解------the-rust-standard-library" class="heading-anchor" aria-label="章节： 深入了解 —— The Rust Standard Library" tabindex="-1"></a><span>深入了解 —— The Rust Standard Library</span></h2>
<p>其实看书的时候就感觉到了<span class="mojikumi-line-end">，</span>很多时候不懂一段代码不是不懂语法<span class="mojikumi-line-end">，</span>而是不懂 <a href="https://doc.rust-lang.org/stable/std/">标准库</a> 的实现<span class="mojikumi-line-end">，</span>而把 API 理解成了没学过的语法<span class="mojikumi-line-end">。</span>了解标准库<span class="mojikumi-line-end">，</span>不仅是提升编码和运行的效率<span class="mojikumi-line-end">，</span>也是能够看懂很多基础代码的关键<span class="mojikumi-line-end">。</span></p>
<p>看文档的时候发现<span class="mojikumi-line-end">，</span>不仅是学到了很多有用的 methods<span class="mojikumi-line-end">，</span>也学到了很多其它东西<span class="mojikumi-line-end">。</span>比如说<span class="mojikumi-line-end">：</span></p>
<ul>
<li>一般来说都可以用 <a href="https://doc.rust-lang.org/stable/std/cmp/fn.max.html"><code>std<wbr>::<wbr>cmp<wbr>::<wbr>max</code></a> 来取 max<span class="mojikumi-line-end">，</span>但 <a href="https://doc.rust-lang.org/stable/std/primitive.f32.html#method.max"><code>f32</code> 专门有一个 <code>pub fn max(self, other: f32) -> f32</code></a><span class="mojikumi-line-end">，</span>这是因为浮点数有 NaN 这个特殊情况导致 <code>f32</code> 没有 impl <a href="https://doc.rust-lang.org/stable/std/cmp/trait.Ord.html"><code>Ord</code></a><span class="mojikumi-line-end">，</span>而 <code>std<wbr>::<wbr>cmp<wbr>::<wbr>max</code> 需要 <code>Ord</code></li>
<li>书里貌似没讲到的 <a href="https://doc.rust-lang.org/stable/std/keyword.ref.html">keyword <code>ref</code></a><span class="mojikumi-line-start">（</span>以及在 pattern matching 中和 <code>&#x26;</code> 的区别<span class="mojikumi-line-end">）</span></li>
<li>引用之间进行比较时会自动转成指向的值<span class="mojikumi-line-end">，</span>即实际进行比较的是指向的值<span class="mojikumi-line-start">（</span>可以通过 <a href="https://doc.rust-lang.org/stable/std/ptr/fn.eq.html"><code>std<wbr>::<wbr>ptr<wbr>::<wbr>eq</code></a> 来比较地址<span class="mojikumi-line-end">）</span></li>
<li>从标准库的 API 设计能领会到很多 trait 和 generic 的用法<span class="mojikumi-line-end">，</span>体会到它们组合在一起的强大</li>
<li><a href="https://doc.rust-lang.org/std/iter/index.html#for-loops-and-intoiterator"><code>Iterator</code> 自动有 <code>IntoIterator</code></a><span class="mojikumi-line-end">，</span>所以用 <code>IntoIterator</code> 代替 <code>Iterator</code> 作为 trait bound 可以让函数更灵活</li>
<li>……</li>
</ul>
<p>简单看一看就能知道 the book 里涉及到的真的只是冰山一角<span class="mojikumi-line-end">，</span>学 Rust 标准库的意义会比学 C++ 的 STL 大得多<span class="mojikumi-line-start">（</span>个人感觉<span class="mojikumi">）</span><wbr><span class="mojikumi-line-start">（</span>也可能是我 C++ 水平太低 / 没认真学 STL 😢<span class="mojikumi">）</span><wbr><span class="mojikumi-line-start">（</span>或者 Primer Plus 讲的全一些<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<h2 id="上课" class="heading"><a href="#上课" class="heading-anchor" aria-label="章节： 上课" tabindex="-1"></a><span>上课</span></h2>
<h3 id="class-1" class="heading"><a href="#class-1" class="heading-anchor" aria-label="章节： Class 1" tabindex="-1"></a><span>Class 1</span></h3>
<p>因为自学过了<span class="mojikumi-line-end">，</span>所以上课就基本上是把老师的声音当作 bgm 偶尔听一下<span class="mojikumi-line-end">，</span>然后继续看标准库文档<span class="mojikumi-line-start">（</span></p>
<p>上课的时候老师提到 Rust 编译器可以提示如何修改<span class="mojikumi-line-end">，</span>于是我顺势在课程群里发了个 <a href="https://twitter.com/st1page/status/1477168761744805891">rust 程序员现状</a> 的截图<span class="mojikumi-line-start">（</span></p>
<p><picture><img type="image/webp" srcset="/assets/rust-programmers-be-like.b8596e6d.webp" loading="lazy" src="/assets/rust-programmers-be-like.b8596e6d.webp" width="706" height="900" alt="rust程序员现状"></picture></p>
<p>课后把 OJ 上的作业速通后发现榜不是公开的 😢</p>
<p>后来还发现自己一道题写了个 <code>collect</code> 得到的 <code>Vec</code> 只用在一个 <code>for</code> 里<span class="mojikumi-line-start">（</span>就是说可以直接把迭代器用在 <code>for</code> 不用先 <code>collect</code><span class="mojikumi-line-end">）</span>😵 想改过来<span class="mojikumi-line-end">，</span>但虽然没有公开榜<span class="mojikumi-line-end">，</span>还是不想承受可能的罚时<span class="mojikumi-line-start">（</span></p>
<h3 id="class-2" class="heading"><a href="#class-2" class="heading-anchor" aria-label="章节： Class 2" tabindex="-1"></a><span>Class 2</span></h3>
<p>第二节课前后共一天多的时间<span class="mojikumi-line-end">，</span>写了 16h 左右<span class="mojikumi-line-end">，</span>把 Wordle 大作业的基础功能写完了<span class="mojikumi">。</span><wbr><span class="mojikumi-line-start">（</span><s>本来以为 Wordle 挺好写的<span class="mojikumi-line-end">，</span>没想到需求这么多<span class="mojikumi-line-end">，</span>需求文档模糊不清的地方还有的要问有的要自己设计<span class="mojikumi-line-end">。</span></s><span class="mojikumi-line-end">）</span></p>
<p>感觉课上讲的又快<span class="mojikumi-line-end">，</span>大作业需要的知识又没讲全<span class="mojikumi-line-end">，</span>很难想象如果不自学该怎么应对这个课<span class="mojikumi-line-start">（</span></p>
<h3 id="class-3" class="heading"><a href="#class-3" class="heading-anchor" aria-label="章节： Class 3" tabindex="-1"></a><span>Class 3</span></h3>
<p>修了一些文档说明不清导致的 bug<span class="mojikumi-line-end">，</span>然后研究了一下扩展功能怎么写<span class="mojikumi-line-end">。</span></p>
<p>不知道为什么把单词按信息熵排序写了半天<span class="mojikumi-line-end">，</span>明明挺简单的<span class="mojikumi-line-end">。</span>可能是听着老师讲课没法专心想算法<span class="mojikumi-line-end">。</span></p>
<p>后来试着用 <a href="https://docs.rs/rayon/latest/rayon/">rayon</a> 把信息熵计算并行化了<span class="mojikumi-line-end">，</span>在我本机除了第一次猜测基本上都能秒出结果<span class="mojikumi-line-end">，</span>感觉很爽 <s><span class="mojikumi-line-end">，</span>甚至玩了半天意义不明的照着提示输入</s><span class="mojikumi-line-end">。</span></p>
<p>再后来发现用 release 模式编译的优化比并行还大 🌚</p>
<h3 id="第一次大作业验收" class="heading"><a href="#第一次大作业验收" class="heading-anchor" aria-label="章节： 第一次大作业验收" tabindex="-1"></a><span>第一次大作业验收</span></h3>
<p>验收在 THUWC 去过的东主楼<span class="mojikumi-line-end">，</span>但上大学后还是第一次去<span class="mojikumi-line-end">，</span>结果走错了<span class="mojikumi-line-end">，</span>迟到了 5min 😵 然后非常慌张地展示提高功能<span class="mojikumi-line-end">，</span>都没太演示全<span class="mojikumi-line-end">，</span><s>感觉白写了</s><span class="mojikumi-line-start">（</span></p>
<h3 id="class-48" class="heading"><a href="#class-48" class="heading-anchor" aria-label="章节： Class 4~8" tabindex="-1"></a><span>Class 4~8</span></h3>
<p>略<span class="mojikumi-line-start">（</span></p>
<h3 id="第二次大作业验收" class="heading"><a href="#第二次大作业验收" class="heading-anchor" aria-label="章节： 第二次大作业验收" tabindex="-1"></a><span>第二次大作业验收</span></h3>
<p>这次真的有比 pretests 强很多的 system test 了<span class="mojikumi-line-end">，</span>还好没 FST<span class="mojikumi-line-start">（</span>助教<span class="mojikumi-line-end">：</span>这个点你为什么能过啊<span class="mojikumi-line-start">（</span>x</p>
<p>可能是因为这个课不是学前端的<span class="mojikumi-line-end">，</span>而且助教只简单看了一下界面演示没看代码<span class="mojikumi-line-end">，</span>槽点很多的前端被夸了很科学<span class="mojikumi-line-start">（</span></p>
<p>可能是因为这个课不是学数据库的<span class="mojikumi-line-end">，</span>而且听说有其他同学数据库里全是 JSON<span class="mojikumi-line-end">，</span>普普通通的建表被夸了很科学<span class="mojikumi-line-start">（</span></p>
<h3 id="关于课上的一些翻译" class="heading"><a href="#关于课上的一些翻译" class="heading-anchor" aria-label="章节： 关于课上的一些翻译" tabindex="-1"></a><span>关于课上的一些翻译</span></h3>
<p>为什么什么都要翻译出来啊<span class="mojikumi-line-start">（</span>虽然如果英语母语的话看原文应该也很尬 🤣</p>
<p><picture><img type="image/webp" srcset="/assets/rust-translations.cc150348.webp" loading="lazy" src="/assets/rust-translations.cc150348.webp" width="500" height="651" alt="trait: 特型；panic: 恐慌；poisoned: 中毒；crate: 箱；library crate: 库箱"></picture></p>
<h3 id="大作业代码" class="heading"><a href="#大作业代码" class="heading-anchor" aria-label="章节： 大作业代码" tabindex="-1"></a><span>大作业代码</span></h3>
<p>听说可以把代码公开 <s>加速熔断</s><span class="mojikumi-line-end">，</span>这就放上来<span class="mojikumi-line-start">（</span></p>
<p><a href="https://github.com/ouuan/course-assignments/tree/master/rust">https<wbr>://<wbr>github<wbr>.<wbr>com<wbr>/<wbr>ouuan<wbr>/<wbr>course<wbr>-<wbr>assignments<wbr>/<wbr>tree<wbr>/<wbr>master<wbr>/<wbr>rust</a></p>
<h2 id="async-rust" class="heading"><a href="#async-rust" class="heading-anchor" aria-label="章节： Async Rust" tabindex="-1"></a><span>Async Rust</span></h2>
<p>先是看了 <a href="https://rust-lang.github.io/async-book/">Asynchronous Programming in Rust</a><span class="mojikumi-line-end">，</span>感觉看得一知半解的<span class="mojikumi-line-start">（</span>尤其是 <code>Pin</code><span class="mojikumi">）</span><span class="mojikumi-line-end">，</span>好像大概知道 <code>Future</code> 在干什么又不完全知道<span class="mojikumi-line-start">（</span><s>而且这本书好咕啊<span class="mojikumi-line-end">，</span><code>TODO</code> 的章节应该是有生之年了</s></p>
<p>没看完 async book<span class="mojikumi-line-end">，</span>直接去看 <a href="https://tokio.rs/tokio/tutorial">Tokio Tutorial</a> 和 <a href="https://book.async.rs/">Async programming in Rust with async-std</a> 了<span class="mojikumi-line-end">。</span>作为 async runtime 的教程<span class="mojikumi-line-end">，</span>它们涉及到的具体原理和实现少一些<span class="mojikumi-line-end">，</span>更注重怎么实际使用<span class="mojikumi-line-end">，</span>读起来会容易理解一些<span class="mojikumi-line-end">。</span>因为 Tokio 更 popular<span class="mojikumi-line-end">，</span>主要看的是 Tokio 的教程<span class="mojikumi-line-end">。</span></p>
<h2 id="数据库-diesel" class="heading"><a href="#数据库-diesel" class="heading-anchor" aria-label="章节： 数据库: Diesel" tabindex="-1"></a><span>数据库: Diesel</span></h2>
<p>感觉 <a href="https://diesel.rs/guides/">diesel 的教程</a> 写的挺简略的<span class="mojikumi-line-end">，</span>但对着 examples 硬查文档也勉强能看懂基本用法<span class="mojikumi-line-end">。</span>ORM 看着就很<span class="mojikumi-line-start">“</span>安全<span class="mojikumi">”</span><span class="mojikumi-line-end">，</span>只不过实在是太类型体操了<span class="mojikumi-line-end">，</span>不仅文档查起来有点小麻烦<span class="mojikumi-line-end">，</span>代码复用也经常因为繁琐的 trait bounds 写不太动<span class="mojikumi-line-start">（</span>也可能是我没学会<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span></p>
<p><a href="https://crates.io/crates/diesel-derive-enum">diesel-derive-enum</a> 是好用的<span class="mojikumi-line-end">。</span></p>
<p>Sqlite 的 <code>RETURNING</code> 语句需要启用 <code>returning_<wbr>clauses_<wbr>for_<wbr>sqlite_<wbr>3_<wbr>35</code> feature flag<span class="mojikumi-line-start">（</span>并且需要至少 3.35 版本的 Sqlite<span class="mojikumi">）</span><span class="mojikumi-line-end">。</span>没启用的时候对着一堆 trait bound 不满足的错误信息<span class="mojikumi-line-start">（</span>就和 C++ 模板感觉差不多了..<span class="mojikumi-line-end">）</span>根本发现不了错误原因<span class="mojikumi-line-end">，</span>还是翻文档翻半天发现的<span class="mojikumi-line-end">。</span></p>
<p>还遇到一个 Sqlite 锁死的坑<span class="mojikumi-line-end">，</span>通过 <a href="https://stackoverflow.com/a/57717533">使用 r2d2 设定 <code>busy_timeout</code></a> 并 <a href="https://github.com/the-lean-crate/criner/issues/1">使用 WAL mode 以及 immediate transaction</a> <span class="mojikumi">（</span>hopefully<span class="mojikumi-line-end">）</span>解决了<span class="mojikumi-line-end">。</span></p>]]></content:encoded>
            <category domain="https://ouuan.moe/tag/Rust">Rust</category>
            <category domain="https://ouuan.moe/tag/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95">学习记录</category>
        </item>
    </channel>
</rss>