<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>小鼠的博客</title>
      <link>https://www.microrat.com</link>
      <description>代码、阅读、日常。随手记录的小角落。</description>
      <generator>Zola</generator>
      <language>zh</language>
      <atom:link href="https://www.microrat.com/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Fri, 22 May 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>使用Linux的软路由实战02：基础网络配置</title>
          <pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/router02/</link>
          <guid>https://www.microrat.com/blog/router02/</guid>
          <description xml:base="https://www.microrat.com/blog/router02/">&lt;!-- 文章从这里开始写 --&gt;
&lt;h1 id=&quot;qian-yan&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#qian-yan&quot; aria-label=&quot;Anchor link for: qian-yan&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;上一章我们已经在 Hyper-V 中搭建好了实验环境——Router VM 和 Client VM 各就各位，但网络还处于各自为政的状态。这一章我们要进入 Router VM，手动配置网络，让它真正扮演路由器的角色。&lt;/p&gt;
&lt;p&gt;本章的目标很简单：&lt;strong&gt;让 Router VM 能够为 Client VM 提供 DHCP 分配地址、转发流量访问外网（NAT）。&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&quot;deng-lu-router-vm&quot;&gt;登录 Router VM&lt;a class=&quot;zola-anchor&quot; href=&quot;#deng-lu-router-vm&quot; aria-label=&quot;Anchor link for: deng-lu-router-vm&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;打开 Hyper-V 管理器，右键 Router 虚拟机 → &lt;strong&gt;连接&lt;/strong&gt;，用你在安装时设置的 root 密码登录。&lt;/p&gt;
&lt;p&gt;首先确认网卡状态：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;ip&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; link&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; show&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你应该能看到两块网卡，命名类似 &lt;code&gt;enpXsY&lt;/code&gt; 的形式（在 Fedora 中，&lt;code&gt;eth0&lt;/code&gt;/&lt;code&gt;eth1&lt;/code&gt; 这类传统命名已被 &lt;code&gt;enpXsY&lt;/code&gt; 取代）。为了表述方便，下文统称为 &lt;strong&gt;WAN 口&lt;/strong&gt;（连接 Default Switch 的那块）和 &lt;strong&gt;LAN 口&lt;/strong&gt;（连接内部交换机的那块）。&lt;/p&gt;
&lt;p&gt;如果不确定哪块对应哪个交换机，可以用以下命令查看：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;ip&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; addr&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; show&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;WAN 口此时应该已经通过 DHCP 从 Default Switch 拿到了一个 IP（通常是 &lt;code&gt;172.x.x.x&lt;/code&gt; 或 &lt;code&gt;192.168.x.x&lt;/code&gt; 网段），而 LAN 口还没有 IP 地址。&lt;/p&gt;
&lt;h1 id=&quot;wei-lan-kou-pei-zhi-jing-tai-ip&quot;&gt;为 LAN 口配置静态 IP&lt;a class=&quot;zola-anchor&quot; href=&quot;#wei-lan-kou-pei-zhi-jing-tai-ip&quot; aria-label=&quot;Anchor link for: wei-lan-kou-pei-zhi-jing-tai-ip&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Router VM 需要为内网（LAN）提供一个固定的网关地址，同时也作为 DHCP 和 DNS 服务的地址。我们给 LAN 口分配一个静态 IP：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;nmcli&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; con&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; show&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这条命令会列出 NetworkManager 管理的连接。找到对应 LAN 口的连接名称（通常是 &lt;code&gt;Wired&lt;/code&gt; 或 &lt;code&gt;enpXsY&lt;/code&gt;），然后执行：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 假设 LAN 口的连接名称为 enpXsY，请替换为实际名称&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;nmcli&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; con&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;enpXsY&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; ipv4.addresses&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; 192.168.10.1/24&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;nmcli&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; con&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;enpXsY&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; ipv4.method&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; manual&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;nmcli&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; con&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; up&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;enpXsY&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;192.168.10.1/24&lt;/code&gt; 是内网网段，你可以换成自己习惯的网段，比如 &lt;code&gt;192.168.1.1/24&lt;/code&gt;，只要后续配置保持一致即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;验证 LAN 口是否已配置成功：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;ip&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; addr&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; show&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; enpXsY&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出中应该能看到 &lt;code&gt;192.168.10.1/24&lt;/code&gt; 这个地址。&lt;/p&gt;
&lt;h1 id=&quot;kai-qi-ip-zhuan-fa&quot;&gt;开启 IP 转发&lt;a class=&quot;zola-anchor&quot; href=&quot;#kai-qi-ip-zhuan-fa&quot; aria-label=&quot;Anchor link for: kai-qi-ip-zhuan-fa&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Linux 默认不会转发数据包——也就是说，从 WAN 口进来的包不会自动走到 LAN 口，反之亦然。要让它成为路由器，必须开启 IP 转发：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 即时生效&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;sysctl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;w&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; net.ipv4.ip_forward=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 写入 sysctl 配置，使重启后依然生效&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);font-style: italic;&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;net.ipv4.ip_forward = 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; /etc/sysctl.d/90-router.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果未来需要支持 IPv6，同样需要开启 &lt;code&gt;net.ipv6.conf.all.forwarding = 1&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;pei-zhi-nat-he-fang-huo-qiang-firewalld&quot;&gt;配置 NAT 和防火墙（firewalld）&lt;a class=&quot;zola-anchor&quot; href=&quot;#pei-zhi-nat-he-fang-huo-qiang-firewalld&quot; aria-label=&quot;Anchor link for: pei-zhi-nat-he-fang-huo-qiang-firewalld&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;开启 IP 转发后，Router VM 可以在不同网口之间转发包，但 WAN 口的数据包无法直接到达内网的 Client VM（它们是私有 IP）。这就需要 NAT（网络地址转换）——将内网 IP 转换为 WAN 口的 IP 访问外网。&lt;/p&gt;
&lt;p&gt;Fedora Server 默认使用 &lt;strong&gt;firewalld&lt;/strong&gt; 管理防火墙。我们通过 &lt;code&gt;firewall-cmd&lt;/code&gt; 配置：&lt;/p&gt;
&lt;h3 id=&quot;pei-zhi-firewalld-qu-yu&quot;&gt;配置 firewalld 区域&lt;a class=&quot;zola-anchor&quot; href=&quot;#pei-zhi-firewalld-qu-yu&quot; aria-label=&quot;Anchor link for: pei-zhi-firewalld-qu-yu&quot;&gt;🔗&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;firewalld 通过「区域」（zone）来管理不同网络的信任级别。我们需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将 &lt;strong&gt;WAN 口&lt;/strong&gt; 放到 &lt;code&gt;external&lt;/code&gt; 区域（开启 masquerade）&lt;/li&gt;
&lt;li&gt;将 &lt;strong&gt;LAN 口&lt;/strong&gt; 放到 &lt;code&gt;internal&lt;/code&gt; 区域（允许内网设备互访）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先查看当前网络接口所属的区域：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-get-active-zones&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面我们通过 NetworkManager 将接口分配到正确的区域。&lt;/p&gt;
&lt;p&gt;先找到两块网卡对应的连接名称：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;nmcli&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; con&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; show&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;记下 WAN 口和 LAN 口对应的连接名称（如 &lt;code&gt;enp1s0&lt;/code&gt;、&lt;code&gt;enp2s0&lt;/code&gt;），然后设置区域：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 将 WAN 口的连接设为 external 区域（开启 masquerade）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;nmcli&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; con&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;enp1s0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; connection.zone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; external&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 将 LAN 口的连接设为 internal 区域（允许内网互访）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;nmcli&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; con&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;enp2s0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; connection.zone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; internal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 重新加载连接使生效&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;nmcli&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; con&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; up&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;enp1s0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;nmcli&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; con&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; up&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;enp2s0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;用 &lt;code&gt;nmcli&lt;/code&gt; 设置 &lt;code&gt;connection.zone&lt;/code&gt; 后，NetworkManager 会负责将区域信息同步给 firewalld，两者互不冲突。重启后配置依然保留。
⚠️ 反过来，此时通过 &lt;code&gt;firewall-cmd --add-interface&lt;/code&gt; 配置区域，NetworkManager 下次重连时会直接覆盖掉。所以区域相关的配置统一走 &lt;code&gt;nmcli&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;yan-zheng-nat-shi-fou-sheng-xiao&quot;&gt;验证 NAT 是否生效&lt;a class=&quot;zola-anchor&quot; href=&quot;#yan-zheng-nat-shi-fou-sheng-xiao&quot; aria-label=&quot;Anchor link for: yan-zheng-nat-shi-fou-sheng-xiao&quot;&gt;🔗&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;输入指令查看完整的区域规则：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-zone=external&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-list-all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;code&gt;external&lt;/code&gt; 区域默认已开启 masquerade，不需要手动执行 &lt;code&gt;--add-masquerade&lt;/code&gt;。如果确认一下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-zone=external&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-add-masquerade&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-permanent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;h3 id=&quot;nei-wang-qu-yu-fang-xing-bi-yao-fu-wu&quot;&gt;内网区域放行必要服务&lt;a class=&quot;zola-anchor&quot; href=&quot;#nei-wang-qu-yu-fang-xing-bi-yao-fu-wu&quot; aria-label=&quot;Anchor link for: nei-wang-qu-yu-fang-xing-bi-yao-fu-wu&quot;&gt;🔗&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;internal&lt;/code&gt; 区域默认放行 SSH 等服务，但我们还需要确保 DHCP 和 DNS 请求能通过防火墙：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-zone=internal&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-add-service=dhcp&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-add-service=dns&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-permanent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;yun-xu-nei-wang-liu-liang-zhuan-fa-dao-wai-wang&quot;&gt;允许内网流量转发到外网&lt;a class=&quot;zola-anchor&quot; href=&quot;#yun-xu-nei-wang-liu-liang-zhuan-fa-dao-wai-wang&quot; aria-label=&quot;Anchor link for: yun-xu-nei-wang-liu-liang-zhuan-fa-dao-wai-wang&quot;&gt;🔗&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;配了 zone 和 masquerade 后，firewalld 默认还是不会转发来自 internal 的流量到 external。需要显式添加一条转发策略：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-permanent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-new-policy&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; internal2external&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-permanent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-policy&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; internal2external&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-add-ingress-zone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; internal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-permanent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-policy&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; internal2external&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-add-egress-zone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; external&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-permanent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-policy&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; internal2external&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-set-target&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; ACCEPT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;internal2external&lt;/code&gt; 含义很直白：来自 internal 区域、去向 external 区域的流量，一律放行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;验证最终配置：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;firewall-cmd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-list-all-zones&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;pei-zhi-dhcp-fu-wu-dnsmasq&quot;&gt;配置 DHCP 服务（dnsmasq）&lt;a class=&quot;zola-anchor&quot; href=&quot;#pei-zhi-dhcp-fu-wu-dnsmasq&quot; aria-label=&quot;Anchor link for: pei-zhi-dhcp-fu-wu-dnsmasq&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;内网的 Client VM 需要自动获取 IP，我们安装 &lt;strong&gt;dnsmasq&lt;/strong&gt; 作为 NetworkManager 的 DNS 和 DHCP 后端，由 NetworkManager 代为管理 dnsmasq 进程。&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 安装 dnsmasq&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;dnf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; dnsmasq&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;qi-yong-dnsmasq-cha-jian&quot;&gt;启用 dnsmasq 插件&lt;a class=&quot;zola-anchor&quot; href=&quot;#qi-yong-dnsmasq-cha-jian&quot; aria-label=&quot;Anchor link for: qi-yong-dnsmasq-cha-jian&quot;&gt;🔗&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;/etc/NetworkManager/conf.d/&lt;/code&gt; 下创建一个配置文件，告诉 NetworkManager 使用 dnsmasq 作为 DNS 后端：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; /etc/NetworkManager/conf.d/00-use-dnsmasq.conf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;[main]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;dns=dnsmasq&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;用 &lt;code&gt;conf.d&lt;/code&gt; 下的独立文件来配置，比直接改 &lt;code&gt;NetworkManager.conf&lt;/code&gt; 更干净，系统更新时不会被覆盖。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;pei-zhi-dnsmasq&quot;&gt;配置 dnsmasq&lt;a class=&quot;zola-anchor&quot; href=&quot;#pei-zhi-dnsmasq&quot; aria-label=&quot;Anchor link for: pei-zhi-dnsmasq&quot;&gt;🔗&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;配置文件不放在 &lt;code&gt;/etc/dnsmasq.conf&lt;/code&gt;，而是放到 NetworkManager 的 dnsmasq 专用目录：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; /etc/NetworkManager/dnsmasq.d/router.conf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;EOF&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;# 监听 LAN 口，不暴露到 WAN 侧&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;interface=enpXsY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;bind-interfaces&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;# DHCP 地址池：从 192.168.10.100 到 192.168.10.200，租期 24h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;dhcp-range=192.168.10.100,192.168.10.200,24h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;# 网关（路由器自身）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;dhcp-option=3,192.168.10.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;# DNS 服务器（直接用114了）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;dhcp-option=6,114.114.114.114&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;# 域名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;local=/lan/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;配置项说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dhcp-range&lt;/code&gt; 定义分配的 IP 范围&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dhcp-option=3&lt;/code&gt; 是网关地址&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dhcp-option=6&lt;/code&gt; 是 DNS 服务器地址&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;重启 NetworkManager 使以上配置生效：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;systemctl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; restart&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; NetworkManager&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;yan-zheng-client-vm-de-wang-luo&quot;&gt;验证 Client VM 的网络&lt;a class=&quot;zola-anchor&quot; href=&quot;#yan-zheng-client-vm-de-wang-luo&quot; aria-label=&quot;Anchor link for: yan-zheng-client-vm-de-wang-luo&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;回到 Client VM 的 Hyper-V 连接窗口，重启网络或直接重启虚拟机：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 在 Client VM 中执行&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;ip&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; addr&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; show&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正常情况下，Client VM 应该从 Router VM 的 dnsmasq 获得一个 &lt;code&gt;192.168.10.x&lt;/code&gt; 网段的 IP。ping 一下网关和外部地址来验证：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;ping&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 192.168.10.1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;          #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 网关（Router VM LAN 口）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;ping&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 8.8.8.8&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;               #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 外网（Google DNS）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果能 ping 通外网，说明 NAT 配置成功。再测试一下 DNS 解析：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;ping&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; baidu.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果域名也能解析，那么 DHCP + DNS + NAT 全套链路就都通了！&lt;/p&gt;
&lt;h1 id=&quot;zong-jie&quot;&gt;总结&lt;a class=&quot;zola-anchor&quot; href=&quot;#zong-jie&quot; aria-label=&quot;Anchor link for: zong-jie&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;到这一步，我们完成了以下工作：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项目&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;✅ LAN 口静态 IP&lt;/td&gt;&lt;td&gt;&lt;code&gt;192.168.10.1/24&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;✅ IP 转发&lt;/td&gt;&lt;td&gt;&lt;code&gt;net.ipv4.ip_forward=1&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;✅ NAT (firewalld)&lt;/td&gt;&lt;td&gt;&lt;code&gt;masquerade&lt;/code&gt; 伪装&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;✅ DHCP 服务 (dnsmasq)&lt;/td&gt;&lt;td&gt;地址池 &lt;code&gt;192.168.10.100-200&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;✅ Client VM 上网&lt;/td&gt;&lt;td&gt;DHCP 分配 + NAT 出网&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Router VM 现在是一台功能完整的家用路由器了！下一章我们将在此基础上引入容器化技术，用 Podman 来运行各种软件，进一步扩展路由器的功能。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>使用Linux的软路由实战01：搭建实验环境</title>
          <pubDate>Sat, 16 May 2026 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/router01/</link>
          <guid>https://www.microrat.com/blog/router01/</guid>
          <description xml:base="https://www.microrat.com/blog/router01/">&lt;!-- 文章从这里开始写 --&gt;
&lt;h1 id=&quot;qian-yan&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#qian-yan&quot; aria-label=&quot;Anchor link for: qian-yan&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;相信很多玩网络的朋友都听说过「软路由」这个词。相比于市面上各种硬路由（如 TP-Link、华硕、小米等），软路由的好处不言而喻：性能强大、功能灵活、可定制性极高。市面上比较流行的方案有 OpenWrt、iStoreOS、爱快、RouterOS 等，它们各有千秋，但本质都是基于 Linux 系统的路由发行版。&lt;/p&gt;
&lt;p&gt;那么，&lt;strong&gt;能不能直接用原生的 Linux 来当路由器呢？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本系列文章将带你从零开始，基于 &lt;strong&gt;Fedora + 容器技术&lt;/strong&gt;，一步步搭建一套完整的家用软路由系统。整个系列计划分为以下几篇：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;搭建实验环境&lt;/strong&gt;（本篇）—— 使用虚拟机模拟家庭网络拓扑&lt;/li&gt;
&lt;li&gt;基础网络配置 —— 更改防火墙配置实现路由功能，包括DHCP服务等&lt;/li&gt;
&lt;li&gt;容器化技术 —— 使用Podman&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;花点时间看完这个系列，你会发现：&lt;strong&gt;路由器不过也是一台 Linux 电脑而已。&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&quot;wei-shen-me-xuan-ze-yuan-sheng-linux-er-fei-openwrt&quot;&gt;为什么选择原生 Linux 而非 OpenWrt？&lt;a class=&quot;zola-anchor&quot; href=&quot;#wei-shen-me-xuan-ze-yuan-sheng-linux-er-fei-openwrt&quot; aria-label=&quot;Anchor link for: wei-shen-me-xuan-ze-yuan-sheng-linux-er-fei-openwrt&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;OpenWrt 固然优秀，但它毕竟是一个面向嵌入式设备的精简发行版，包管理、内核版本、文件系统等都和主流的发行版有一定差异。如果你已经熟悉 Linux，直接在 Fedora 上搭建路由非常简单——你只是多配了几个网络参数而已。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;包管理&lt;/strong&gt;：dnf 生态远比 opkg 丰富，安装软件更方便&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内核更新&lt;/strong&gt;：及时跟进主线内核，支持更新的网卡驱动和协议&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;故障排查&lt;/strong&gt;：标准的 Linux 网络调试手段全部适用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通用性&lt;/strong&gt;：这台机器本质上还是一台正常的 Linux 主机&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;shi-yan-huan-jing-gai-lan&quot;&gt;实验环境概览&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yan-huan-jing-gai-lan&quot; aria-label=&quot;Anchor link for: shi-yan-huan-jing-gai-lan&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;这一篇我们会用 &lt;strong&gt;Hyper-V&lt;/strong&gt; 搭建如下拓扑：&lt;/p&gt;
&lt;div class=&quot;mermaid&quot;&gt;graph TD
    subgraph HOST [宿主机 Windows]
        subgraph INTERNAL [内部网络 Internal Network]
            ROUTER[Router VM Fedora&lt;br&gt;eth1: 内部网桥]
            CLIENT[Client VM&lt;br&gt;验证 DHCP + DNS + NAT]
        end
        ROUTER -- eth1 连接 --&gt; CLIENT
    end
    INTERNET((外网 Internet))
    ROUTER -- eth0: NAT 连接 --&gt; INTERNET
    style HOST fill:#E2F0D9,stroke:#70AD47,stroke-width:2px
    style INTERNAL fill:#D9E1F2,stroke:#4472C4,stroke-width:2px,stroke-dasharray: 5 5
    style ROUTER fill:#FFF2CC,stroke:#BF8F00
    style CLIENT fill:#FFF2CC,stroke:#BF8F00
    style INTERNET fill:#F8CBAD,stroke:#ED7D31
&lt;/div&gt;
&lt;p&gt;我们会在 Router VM 上配置两个网络接口：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;eth0&lt;/strong&gt;：以 NAT 方式连接宿主机网络，模拟 WAN 口（外网）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;eth1&lt;/strong&gt;：连接到一个内部虚拟交换机，模拟 LAN 口（内网）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Client VM 则只需一个网卡，连接到同一个 Internal Network，用来验证路由器提供的 DHCP、DNS、NAT 等是否正常工作。&lt;/p&gt;
&lt;h1 id=&quot;suo-xu-ruan-jian&quot;&gt;所需软件&lt;a class=&quot;zola-anchor&quot; href=&quot;#suo-xu-ruan-jian&quot; aria-label=&quot;Anchor link for: suo-xu-ruan-jian&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;在开始之前，请确保你的宿主机上已安装以下软件：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;软件&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Hyper-V&lt;/td&gt;&lt;td&gt;虚拟机管理平台&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Fedora Server ISO&lt;/td&gt;&lt;td&gt;操作系统镜像&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;本系列均以 &lt;strong&gt;Fedora Server 44&lt;/strong&gt; 为例。如果你用的是其他发行版，大部分命令同样适用，只需注意包名和网络配置文件的差异。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;zheng-shi-cao-zuo&quot;&gt;正式操作&lt;a class=&quot;zola-anchor&quot; href=&quot;#zheng-shi-cao-zuo&quot; aria-label=&quot;Anchor link for: zheng-shi-cao-zuo&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;qi-yong-hyper-v&quot;&gt;启用 Hyper-V&lt;a class=&quot;zola-anchor&quot; href=&quot;#qi-yong-hyper-v&quot; aria-label=&quot;Anchor link for: qi-yong-hyper-v&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果你用的是 Windows 10/11 专业版或企业版，Hyper-V 默认已安装但可能未启用。检查方式如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;strong&gt;控制面板 → 程序和功能 → 启用或关闭 Windows 功能&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;找到 &lt;strong&gt;Hyper-V&lt;/strong&gt;，确保其下的 &lt;strong&gt;Hyper-V 管理工具&lt;/strong&gt; 和 &lt;strong&gt;Hyper-V 平台&lt;/strong&gt; 均已勾选&lt;/li&gt;
&lt;li&gt;若未勾选，勾选后点击确定，重启电脑&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;重启后在开始菜单搜索 &lt;strong&gt;Hyper-V 管理器&lt;/strong&gt; 并打开。&lt;/p&gt;
&lt;h2 id=&quot;chuang-jian-xu-ni-jiao-huan-ji&quot;&gt;创建虚拟交换机&lt;a class=&quot;zola-anchor&quot; href=&quot;#chuang-jian-xu-ni-jiao-huan-ji&quot; aria-label=&quot;Anchor link for: chuang-jian-xu-ni-jiao-huan-ji&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;我们需要两个虚拟交换机：一个连接外网（WAN），一个连接内网（LAN）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hyper-V 管理器&lt;/strong&gt; 默认启用的 &lt;strong&gt;Default Switch&lt;/strong&gt; 会以 NAT 的形式为连接上的虚拟机提供网络，我们使用这个交换机当做外部网络。下面我们创建内部的交换机。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点击右侧的 &lt;strong&gt;虚拟交换机管理器&lt;/strong&gt;，选择创建 &lt;strong&gt;内部&lt;/strong&gt; 交换机&lt;/li&gt;
&lt;li&gt;名称填 &lt;code&gt;LAN&lt;/code&gt;，点击确定&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;三种虚拟交换机的区别&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th style=&quot;text-align: center&quot;&gt;虚拟机 ↔ 虚拟机&lt;/th&gt;&lt;th style=&quot;text-align: center&quot;&gt;虚拟机 ↔ 宿主机&lt;/th&gt;&lt;th style=&quot;text-align: center&quot;&gt;虚拟机 ↔ 外网&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;外部&lt;/strong&gt; (External)&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;内部&lt;/strong&gt; (Internal)&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;❌&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;专用&lt;/strong&gt; (Private)&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;✅&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;❌&lt;/td&gt;&lt;td style=&quot;text-align: center&quot;&gt;❌&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/blockquote&gt;
&lt;p&gt;完成后的虚拟交换机列表：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;名称&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Default Switch&lt;/td&gt;&lt;td&gt;NAT&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;LAN&lt;/td&gt;&lt;td&gt;内部&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;chuang-jian-router-vm&quot;&gt;创建 Router VM&lt;a class=&quot;zola-anchor&quot; href=&quot;#chuang-jian-router-vm&quot; aria-label=&quot;Anchor link for: chuang-jian-router-vm&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在 Hyper-V 管理器右侧点击 &lt;strong&gt;新建 → 虚拟机&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;名称&lt;/strong&gt;：&lt;code&gt;Router&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代数&lt;/strong&gt;：选择&lt;strong&gt;第二代&lt;/strong&gt;（支持 UEFI 引导）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：分配 &lt;strong&gt;1024 MB&lt;/strong&gt;，取消勾选 &lt;strong&gt;动态内存&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络&lt;/strong&gt;：先选择 &lt;strong&gt;未连接&lt;/strong&gt;（后续配置双网卡）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟硬盘&lt;/strong&gt;：创建新虚拟硬盘，大小 &lt;strong&gt;20 GB&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装选项&lt;/strong&gt;：选择 &lt;strong&gt;从可引导的 CD/DVD-ROM 安装操作系统&lt;/strong&gt;，点击 &lt;strong&gt;浏览&lt;/strong&gt; 选中 Fedora Server ISO&lt;/li&gt;
&lt;li&gt;点击完成&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;pei-zhi-shuang-wang-qia&quot;&gt;配置双网卡&lt;a class=&quot;zola-anchor&quot; href=&quot;#pei-zhi-shuang-wang-qia&quot; aria-label=&quot;Anchor link for: pei-zhi-shuang-wang-qia&quot;&gt;🔗&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;右键 Router 虚拟机 → &lt;strong&gt;设置&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;左侧选择 &lt;strong&gt;添加硬件 → 网络适配器 → 添加&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;第一个网卡（对应 eth0 / WAN）：虚拟交换机选择 &lt;code&gt;Default Switch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;再添加第二个网卡（对应 eth1 / LAN）：虚拟交换机选择 &lt;code&gt;LAN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;点击确定&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;网卡的添加顺序决定了 Linux 内核中的接口命名顺序，先添加的是 eth0，后添加的是 eth1。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;an-zhuang-xi-tong&quot;&gt;安装系统&lt;a class=&quot;zola-anchor&quot; href=&quot;#an-zhuang-xi-tong&quot; aria-label=&quot;Anchor link for: an-zhuang-xi-tong&quot;&gt;🔗&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;右键 Router 虚拟机 → &lt;strong&gt;连接&lt;/strong&gt; → &lt;strong&gt;启动&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;从 ISO 引导后，选择 &lt;strong&gt;Install Fedora Server 44&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;选择语言（推荐 English，避免终端路径乱码）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Installation Destination&lt;/strong&gt;：直接使用自动分区&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network &amp;amp; Host Name&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;主机名改为 &lt;code&gt;router.lan&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;暂时无需配置 IP，安装完成后手动配置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;设置 &lt;strong&gt;Root Password&lt;/strong&gt; 和创建一个管理员用户&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;Begin Installation&lt;/strong&gt;，等待完成&lt;/li&gt;
&lt;li&gt;完成后 &lt;strong&gt;Reboot&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;chuang-jian-client-vm&quot;&gt;创建 Client VM&lt;a class=&quot;zola-anchor&quot; href=&quot;#chuang-jian-client-vm&quot; aria-label=&quot;Anchor link for: chuang-jian-client-vm&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;名称&lt;/strong&gt;：&lt;code&gt;Client&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代数&lt;/strong&gt;：第二代&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：&lt;strong&gt;2048 MB&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络&lt;/strong&gt;：直接选择 &lt;code&gt;LAN&lt;/code&gt;（只需要一个网卡）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚拟硬盘&lt;/strong&gt;：20 GB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装选项&lt;/strong&gt;：同样使用 Fedora Server ISO&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;安装时注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主机名设为 &lt;code&gt;client.lan&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;网络配置保持 &lt;strong&gt;自动（DHCP）&lt;/strong&gt;，后续由 Router VM 分配 IP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;两台虚拟机安装完成后，分别启动并登录。此时 Client VM 因为还没 DHCP 服务，暂时获取不到 IP，属于正常现象。下一节我们将进入 Router VM，配置完整的网络服务。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>你好，世界</title>
          <pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/hello-world/</link>
          <guid>https://www.microrat.com/blog/hello-world/</guid>
          <description xml:base="https://www.microrat.com/blog/hello-world/">&lt;p&gt;折腾了几天，终于把博客搭起来了。&lt;/p&gt;
&lt;h2 id=&quot;wei-shen-me-xie-bo-ke&quot;&gt;为什么写博客&lt;a class=&quot;zola-anchor&quot; href=&quot;#wei-shen-me-xie-bo-ke&quot; aria-label=&quot;Anchor link for: wei-shen-me-xie-bo-ke&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;其实想法很简单——需要一个属于自己的地方，不用管字数限制、不用考虑算法推荐，想写什么就写什么。&lt;/p&gt;
&lt;h2 id=&quot;ji-shu-xuan-xing&quot;&gt;技术选型&lt;a class=&quot;zola-anchor&quot; href=&quot;#ji-shu-xuan-xing&quot; aria-label=&quot;Anchor link for: ji-shu-xuan-xing&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;选了 &lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://www.getzola.org/&quot;&gt;Zola&lt;/a&gt;，一个用 Rust 写的静态站点生成器。体积极小、构建飞快，没有 Node.js 那堆依赖。&lt;/p&gt;
&lt;h2 id=&quot;hui-xie-xie-shen-me&quot;&gt;会写些什么&lt;a class=&quot;zola-anchor&quot; href=&quot;#hui-xie-xie-shen-me&quot; aria-label=&quot;Anchor link for: hui-xie-xie-shen-me&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;计划写三类内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;技术笔记&lt;/strong&gt; — 踩坑记录、工具推荐、代码片段&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生活碎片&lt;/strong&gt; — 日常、阅读、随感&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;现实思考&lt;/strong&gt; — 对技术、工作、成长的一些想法&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;zui-hou&quot;&gt;最后&lt;a class=&quot;zola-anchor&quot; href=&quot;#zui-hou&quot; aria-label=&quot;Anchor link for: zui-hou&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;很高兴你来到这里。&lt;/p&gt;
&lt;p&gt;我们下一篇文章见。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust线程</title>
          <pubDate>Tue, 20 May 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-concurrency/</link>
          <guid>https://www.microrat.com/blog/rust-concurrency/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-concurrency/">&lt;p&gt;并发编程（Concurrent programming）代表程序不同部分相互独立地执行，而并行（parallel programming）代表程序不同部分同时执行。&lt;/p&gt;
&lt;p&gt;Rust提供了多种工具以符合实际情况和需求来为问题建模。&lt;/p&gt;
&lt;p&gt;大部分现代操作系统中，已执行程序的代码在一个进程（process）中运行，操作系统会负责管理多个进程。在程序内部可以拥有多个同时运行的独立部分，称作线程（threads）。将程序拆分进多个线程可以改善性能，不过会增加复杂性。因为程序是同时运行的，所以无法保证不同线程中代码的执行顺序，这会导致以下问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;竞态条件（Race condition），当多个线程以不一致的顺序访问数据或资源&lt;/li&gt;
&lt;li&gt;死锁（Deadlock），当两个或多个线程相互等待对方释放资源&lt;/li&gt;
&lt;li&gt;只会发生在特定情况且难以稳定重现和修复的bug。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rust标准库使用1:1线程实现，每个语言级线程使用一个系统线程。&lt;/p&gt;
&lt;h1 id=&quot;shi-yong-spawnchuang-jian-xin-xian-cheng&quot;&gt;使用spawn创建新线程&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-spawnchuang-jian-xin-xian-cheng&quot; aria-label=&quot;Anchor link for: shi-yong-spawnchuang-jian-xin-xian-cheng&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;为了创建一个新线程，需要调用&lt;code&gt;thread::spawn&lt;/code&gt;函数，这个函数会获取一个闭包（closure）作为参数，这个闭包会在新线程中执行：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Duration&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;    thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;spawn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        for&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;            println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hi number &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from the spawned thread!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;            thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;sleep&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Duration&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from_millis&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    for&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hi number &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from the main thread!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;        thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;sleep&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Duration&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from_millis&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码在新线程和主线程中打印了一些文本，主线程结束时，新线程也会结束而不管其是否执行完毕。这个程序输出每次可能略有不同，不过大体上看起来像这样：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;thread::sleep&lt;/code&gt;调用强制线程停止执行一小段时间，允许其他不同的线程运行，这些线程的运行依赖操作系统的调度。&lt;/p&gt;
&lt;h1 id=&quot;shi-yong-joindeng-dai-suo-you-xian-cheng-jie-shu&quot;&gt;使用join等待所有线程结束&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-joindeng-dai-suo-you-xian-cheng-jie-shu&quot; aria-label=&quot;Anchor link for: shi-yong-joindeng-dai-suo-you-xian-cheng-jie-shu&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;由于主线程结束，其他线程的代码甚至可能不会被执行，可以通过将&lt;code&gt;thread::spawn&lt;/code&gt;的返回值储存在变量中来修复新建线程没有执行的问题。&lt;code&gt;thread::spawn&lt;/code&gt;返回的是&lt;code&gt;JoinHandle&lt;/code&gt;类型，这个一个拥有所有权的值。&lt;code&gt;JoinHandle&lt;/code&gt;的&lt;code&gt;join&lt;/code&gt;方法会让主线程等待新线程结束：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;time&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Duration&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; handle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;spawn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        for&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;            println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hi number &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from the spawned thread!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;            thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;sleep&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Duration&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from_millis&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    for&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hi number &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from the main thread!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;        thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;sleep&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Duration&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from_millis&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    handle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码调用&lt;code&gt;handle&lt;/code&gt;的&lt;code&gt;join&lt;/code&gt;方法，这个方法会阻塞（Blocking）当前线程，直到新线程结束。这段代码产生类似下面的输出：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 6&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 8&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;hi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 9&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; spawned&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; thread!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果将&lt;code&gt;handle.join().unwrap();&lt;/code&gt;放在&lt;code&gt;main&lt;/code&gt;中&lt;code&gt;for&lt;/code&gt;循环之前，则会先打印出新线程的输出，再打印主线程的输出。&lt;/p&gt;
&lt;h1 id=&quot;jiang-movebi-bao-yu-xian-cheng-yi-tong-shi-yong&quot;&gt;将move闭包与线程一同使用&lt;a class=&quot;zola-anchor&quot; href=&quot;#jiang-movebi-bao-yu-xian-cheng-yi-tong-shi-yong&quot; aria-label=&quot;Anchor link for: jiang-movebi-bao-yu-xian-cheng-yi-tong-shi-yong&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;move&lt;/code&gt;关键字经常用于传递给&lt;code&gt;thread::spawn&lt;/code&gt;的闭包。&lt;code&gt;move&lt;/code&gt;关键字会强制闭包获取其使用的变量的所有权，这意味着这些值的所有权会从一个线程转移到另一个线程。下面是一个在主线程中创建一个&lt;code&gt;vector&lt;/code&gt;并用于新建线程的例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; handle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;spawn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Here&amp;#39;s a vector: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    handle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里闭包会捕获&lt;code&gt;v&lt;/code&gt;，并在新线程中访问&lt;code&gt;v&lt;/code&gt;，但是这段代码会报错，因为Rust会尝试对&lt;code&gt;v&lt;/code&gt;借用，由于Rust不知道新线程会持续执行多久，所以无法知晓对&lt;code&gt;v&lt;/code&gt;的引用是否一致有效。下面是一个例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; handle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;spawn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Here&amp;#39;s a vector: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    drop&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    handle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果这段代码可以运行，新线程可能根本没有机会运行，这里在新线程开始运行后主线程直接丢弃了&lt;code&gt;v&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;通过在闭包前增加&lt;code&gt;move&lt;/code&gt;关键字，可以强制闭包获取所有权，而不是由Rust推断的借用，下面为修改后的代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; handle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;spawn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;move&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Here&amp;#39;s a vector: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    handle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果在&lt;code&gt;handle&lt;/code&gt;之前调用&lt;code&gt;drop(v)&lt;/code&gt;，则这段代码会报错，因为&lt;code&gt;v&lt;/code&gt;的所有权已经被移动到了新线程中，主线程无法再访问&lt;code&gt;v&lt;/code&gt;。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>conda环境部署</title>
          <pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/conda-guide/</link>
          <guid>https://www.microrat.com/blog/conda-guide/</guid>
          <description xml:base="https://www.microrat.com/blog/conda-guide/">&lt;p&gt;conda是一个跨平台包管理工具。对于每一个python项目，我们可能需要有不同的python版本，不同的包，我们就可以使用conda来创建并管理这些虚拟环境。对于数据分析，有时我们并不需要完全地创建一个项目，而只是在相应地环境里面运行jupyter notebook来完成一些任务，我们就可以使用conda来创建虚拟环境，并进入这些环境来完成任务。在开始部署conda前，我们先介绍一下conda的几个发行版：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Anaconda：这个发行版在基本（base）环境中安装了大量的包，可以直接在其base环境中运行，而假如创建新的虚拟环境，如果本地有缓存，那么就可以直接从缓存中安装包，不需要重新下载，否则就需要重新下载。&lt;/li&gt;
&lt;li&gt;Miniconda：这个发行版在基本（base）环境中安装了很少的包，只包含了conda和python的基本包，不包含任何其他的包。&lt;/li&gt;
&lt;li&gt;Miniforge：这个发行版和Miniconda类似，并增加了mamba这个conda的替代品，它用C++重写了部分功能，在提供了更好的性能的同时完全兼容conda。Miniforge默认使用社区维护的Conda-Forge仓库作为包的来源，而不是官方的Anaconda仓库，Conda-forge的包通常比官方Anaconda仓库更新得更快，并且完全开源免费，不必在意商业许可证上面的问题。&lt;/li&gt;
&lt;li&gt;Micromamba：micromamba是mamba的静态链接版本，它和Miniforge类似，但它的base环境没有python和其他包。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基于它们的区别，我选择使用micromamba，本文的指南将基于micromamba和Miniforge来介绍conda的部署。&lt;/p&gt;
&lt;h1 id=&quot;an-zhuang&quot;&gt;安装&lt;a class=&quot;zola-anchor&quot; href=&quot;#an-zhuang&quot; aria-label=&quot;Anchor link for: an-zhuang&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;windowsping-tai-an-zhuang&quot;&gt;Windows平台安装&lt;a class=&quot;zola-anchor&quot; href=&quot;#windowsping-tai-an-zhuang&quot; aria-label=&quot;Anchor link for: windowsping-tai-an-zhuang&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在Windows平台上安装Miniforge，我们可以下载Miniforge的&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; title=&quot;这是官方github的下载链接&quot; href=&quot;https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Windows-x86_64.exe&quot;&gt;安装程序&lt;/a&gt;，然后运行安装程序安装。&lt;/p&gt;
&lt;p&gt;在最新的Windows11系统中我们可以使用winget来安装Miniforge，在power shell中输入以下命令：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;winget install CondaForge.Miniforge3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于Micromamba，官方提供了以下命令：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Invoke-Expression&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Invoke-WebRequest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&lt;/span&gt;&lt;span&gt;Uri https:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;/&lt;/span&gt;&lt;span&gt;micro.mamba.pm&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;/&lt;/span&gt;&lt;span&gt;install.ps1 &lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;-&lt;/span&gt;&lt;span&gt;UseBasicParsing&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span&gt;.Content&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然如果能使用winget，我们也可以输入以下命令来安装：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;powershell&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;winget install mamba.Micromamba&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;linuxping-tai-an-zhuang&quot;&gt;Linux平台安装&lt;a class=&quot;zola-anchor&quot; href=&quot;#linuxping-tai-an-zhuang&quot; aria-label=&quot;Anchor link for: linuxping-tai-an-zhuang&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在Linux上，可以直接使用官方提供的脚本安装Miniconda：&lt;/p&gt;
&lt;p&gt;先下载：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;L&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;O&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;uname&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;uname&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;.sh&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后运行：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;bash&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; Miniforge3-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;uname&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;uname&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于Micromamba，官方提供了以下命令：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;SHELL&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;lt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;L&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; micro.mamba.pm/install.sh&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在完成安装后，我们可以使用&lt;code&gt;mamba --version&lt;/code&gt;或&lt;code&gt;micromamba --version&lt;/code&gt;来查看版本。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust引用循环和内存泄漏</title>
          <pubDate>Sat, 17 May 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-reference-cycles/</link>
          <guid>https://www.microrat.com/blog/rust-reference-cycles/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-reference-cycles/">&lt;p&gt;Rust很难制造&lt;strong&gt;内存泄漏&lt;/strong&gt;（memory leak），但并不是不可能，使用Rc&lt;T&gt;和RefCell&lt;T&gt;创建引用循环会造成内存泄漏，因为每一项的引用计数永远也到不了0，持有的数据也永远不会被释放。&lt;/p&gt;
&lt;h1 id=&quot;zhi-zao-yin-yong-xun-huan&quot;&gt;制造引用循环&lt;a class=&quot;zola-anchor&quot; href=&quot;#zhi-zao-yin-yong-xun-huan&quot; aria-label=&quot;Anchor link for: zhi-zao-yin-yong-xun-huan&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; crate&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;cell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;derive&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; tail&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Option&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        match&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;            Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Some&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; None&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;a initial rc count = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;a next item = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;tail&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;a rc count after b creation = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;b initial rc count = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;b next item = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;tail&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Some&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;tail&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;        *&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;borrow_mut&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;b rc count after changing a = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;a rc count after changing a = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;    //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; Uncomment the next line to see that we have a cycle;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;    //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; it will overflow the stack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;    //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; println!(&amp;quot;a next item = {:?}&amp;quot;, a.tail());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里&lt;code&gt;Cons&lt;/code&gt;的第二项是&lt;code&gt;RefCell&amp;lt;Rc&amp;lt;List&amp;gt;&amp;gt;&lt;/code&gt;，这里就可以修改&lt;code&gt;Cons&lt;/code&gt;指向的&lt;code&gt;List&lt;/code&gt;，并且增加了个&lt;code&gt;tail&lt;/code&gt;方法来获取&lt;code&gt;Cons&lt;/code&gt;的第二项。&lt;/p&gt;
&lt;p&gt;在main函数中，我们创建了一个&lt;code&gt;Cons&lt;/code&gt;，它的第二项指向了&lt;code&gt;Nil&lt;/code&gt;，然后我们创建了一个&lt;code&gt;Cons&lt;/code&gt;，它的第二项指向了第一个&lt;code&gt;Cons&lt;/code&gt;，后面我们修改了第一个&lt;code&gt;Cons&lt;/code&gt;的第二项，使其指向了第二个&lt;code&gt;Cons&lt;/code&gt;，这样就形成了一个引用循环。
运行结果：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;a initial rc count = 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;a next item = Some(RefCell { value: Nil })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;a rc count after b creation = 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;b initial rc count = 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;b next item = Some(RefCell { value: Cons(5, RefCell { value: Nil }) })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;b rc count after changing a = 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;a rc count after changing a = 2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到在将第一个&lt;code&gt;Cons&lt;/code&gt;的第二项指向第二个&lt;code&gt;Cons&lt;/code&gt;后，两个列表的引用计数都是2，在最后，Rust丢弃&lt;code&gt;b&lt;/code&gt;，这时第二个实例的引用计数减为1，然后Rust丢弃&lt;code&gt;a&lt;/code&gt;，这时第一个实例的引用计数减为1，但是由于这两个实例的引用计数不为0，所以第二个实例不会被释放，这样就形成了一个引用循环。&lt;/p&gt;
&lt;p&gt;如果我们取消代码后面注释的&lt;code&gt;println!&lt;/code&gt;，Rust就会打印&lt;code&gt;a&lt;/code&gt;指向&lt;code&gt;b&lt;/code&gt;，然后&lt;code&gt;b&lt;/code&gt;指向&lt;code&gt;a&lt;/code&gt;，这样就会一直循环下去，直到栈溢出。&lt;/p&gt;
&lt;p&gt;如果在更为复杂的程序中的循环里分配了很多内存并占有很长时间，这个程序会使用多余它所需要的内存，有可能压垮系统并造成没有内存可供使用。&lt;/p&gt;
&lt;p&gt;对于循环引用，除了使用自动化测试、代码评审等使其最小化，也可以重新组织数据结构，让一部分引用有所有权而另一部分没有，这样只有有所有权的才能影响值是否被丢弃。&lt;/p&gt;
&lt;h1 id=&quot;jiang-rcbian-wei-weak&quot;&gt;将Rc&lt;T&gt;变为Weak&lt;T&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#jiang-rcbian-wei-weak&quot; aria-label=&quot;Anchor link for: jiang-rcbian-wei-weak&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑以下代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;cell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;derive&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    children&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        children&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; branch&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        children&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里定义了一个&lt;code&gt;Node&lt;/code&gt;结构体，它有一个值和一个子节点的向量，子节点是&lt;code&gt;Rc&amp;lt;Node&amp;gt;&lt;/code&gt;，这样就可以创建一个树，并拥有子节点的所有权，也可以更改子节点。&lt;/p&gt;
&lt;p&gt;接下来，我们创建了一个&lt;code&gt;leaf&lt;/code&gt;节点和一个&lt;code&gt;branch&lt;/code&gt;节点，&lt;code&gt;leaf&lt;/code&gt;节点没有子节点，&lt;code&gt;branch&lt;/code&gt;节点有一个子节点&lt;code&gt;leaf&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这个时候，我们需要让&lt;code&gt;leaf&lt;/code&gt;节点知道&lt;code&gt;branch&lt;/code&gt;是他的父节点。&lt;/p&gt;
&lt;h1 id=&quot;zeng-jia-zi-dao-fu-de-yin-yong&quot;&gt;增加子到父的引用&lt;a class=&quot;zola-anchor&quot; href=&quot;#zeng-jia-zi-dao-fu-de-yin-yong&quot; aria-label=&quot;Anchor link for: zeng-jia-zi-dao-fu-de-yin-yong&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;我们需要在&lt;code&gt;Node&lt;/code&gt;结构体中增加一个&lt;code&gt;parent&lt;/code&gt;字段，这个字段如果是&lt;code&gt;RefCell&amp;lt;Rc&amp;lt;Node&amp;gt;&amp;gt;&lt;/code&gt;，就可以存储父节点的引用，但是会形成循环引用。现在换一个思路，如果父节点被丢弃，则子节点也应该被丢弃，如果丢弃子节点，其父节点应该依然存在，这便是弱引用的例子。&lt;/p&gt;
&lt;p&gt;我们可以使用&lt;code&gt;Weak&amp;lt;T&amp;gt;&lt;/code&gt;来存储父节点的引用，这样就可以避免循环引用：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;cell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Weak&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;derive&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    parent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Weak&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    children&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        parent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Weak&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        children&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;leaf parent = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;parent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;borrow&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;upgrade&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; branch&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        parent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Weak&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        children&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;    *&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;parent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;borrow_mut&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;downgrade&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;branch&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;leaf parent = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;parent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;borrow&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;upgrade&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样子节点就能引用父节点而不拥有父节点，并且使用&lt;code&gt;upgrade&lt;/code&gt;方法可以获得包含父节点引用的&lt;code&gt;Option&lt;/code&gt;类型。第一个打印时&lt;code&gt;leaf&lt;/code&gt;并没有父节点，所以输出为：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;leaf parent = None&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二个打印时&lt;code&gt;leaf&lt;/code&gt;有父节点，而&lt;code&gt;Weak&amp;lt;Node&amp;gt;&lt;/code&gt;会被打印为&lt;code&gt;(Weak)&lt;/code&gt;，避免了栈溢出的循环，所以输出为：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;leaf parent = Some(Node { value: 5, parent: RefCell { value: (Weak) }, children: RefCell { value: [Node { value: 3, parent: RefCell { value: (Weak) }, children: RefCell { value: [] } }] } })&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;ke-shi-hua-strong-counthe-weak-countde-gai-bian&quot;&gt;可视化strong_count和weak_count的改变&lt;a class=&quot;zola-anchor&quot; href=&quot;#ke-shi-hua-strong-counthe-weak-countde-gai-bian&quot; aria-label=&quot;Anchor link for: ke-shi-hua-strong-counthe-weak-countde-gai-bian&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;cell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Weak&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;derive&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    parent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Weak&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    children&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        parent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Weak&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        children&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;leaf strong = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;, weak = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;weak_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    )&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; branch&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            parent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Weak&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            children&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;        *&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;parent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;borrow_mut&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;downgrade&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;branch&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;            &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;branch strong = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;, weak = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;branch&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;weak_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;branch&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        )&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;            &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;leaf strong = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;, weak = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;weak_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        )&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;leaf parent = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;parent&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;borrow&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;upgrade&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;leaf strong = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;, weak = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;weak_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;leaf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    )&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一开始创建了&lt;code&gt;leaf&lt;/code&gt;，它的强引用计数为1，弱引用计数为0，后面内部作用域创建&lt;code&gt;branch&lt;/code&gt;后，&lt;code&gt;branch&lt;/code&gt;的强引用计数为1，弱引用计数为1，&lt;code&gt;leaf&lt;/code&gt;的强引用计数为2，弱引用计数为0，后面离开内部作用域，&lt;code&gt;branch&lt;/code&gt;的强引用计数为0，被丢弃，&lt;code&gt;leaf&lt;/code&gt;的强引用计数为1，弱引用计数为0。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>考试结束</title>
          <pubDate>Mon, 12 May 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/exam-down/</link>
          <guid>https://www.microrat.com/blog/exam-down/</guid>
          <description xml:base="https://www.microrat.com/blog/exam-down/">&lt;p&gt;终于考完了数学，✋😭✋&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust智能指针RefCell&lt;T&gt;</title>
          <pubDate>Fri, 02 May 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-pointer-refcell/</link>
          <guid>https://www.microrat.com/blog/rust-pointer-refcell/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-pointer-refcell/">&lt;p&gt;&lt;strong&gt;内部可变性&lt;/strong&gt;（Interior mutability）是Rust中的一个设计模式，它允许你在有不可变引用时也可以改变数据。这需要在数据结构中使用&lt;code&gt;unsafe&lt;/code&gt;代码来模糊Rust的可变性与借用规则。&lt;/p&gt;
&lt;p&gt;可以确保代码在运行时会遵守借用规则，可以使用运用内部可变性模式的类型，涉及&lt;code&gt;unsafe&lt;/code&gt;代码被封装进安全的API中。外部类型依旧是不可变的。&lt;/p&gt;
&lt;h1 id=&quot;shi-yong-refcellzai-yun-xing-shi-jian-cha-jie-yong-gui-ze&quot;&gt;使用RefCell&lt;T&gt;在运行时检查借用规则&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-refcellzai-yun-xing-shi-jian-cha-jie-yong-gui-ze&quot; aria-label=&quot;Anchor link for: shi-yong-refcellzai-yun-xing-shi-jian-cha-jie-yong-gui-ze&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;ReCell&amp;lt;T&amp;gt;&lt;/code&gt;代表数据的唯一所有权，RefCell&lt;T&gt;允许在运行时检查借用规则而不是编译时。在运行时违反规则程序会panic。&lt;/p&gt;
&lt;p&gt;在一些特定的内存安全场景，虽没违反规则，但是在编译时检查却不被允许，&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;就派上用场了。&lt;/p&gt;
&lt;p&gt;类似于&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;，&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;也只能用于单线程场景，下面是选择&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt;、&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;还是&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;的理由：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;允许相同数据有多个所有者，&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;和&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt;有单一所有者。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt;在编译时执行不可变或可变借用检查，&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;在编译时执行不可变借用检查，&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;在运行时执行不可变或可变借用检查。&lt;/li&gt;
&lt;li&gt;允许在&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;自身不可变的情况下修改其内部的值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;nei-bu-ke-bian-xing-yong-li-mockdui-xiang&quot;&gt;内部可变性用例：mock对象&lt;a class=&quot;zola-anchor&quot; href=&quot;#nei-bu-ke-bian-xing-yong-li-mockdui-xiang&quot; aria-label=&quot;Anchor link for: nei-bu-ke-bian-xing-yong-li-mockdui-xiang&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;有时程序员会用某个类型替代另一个类型，观察其某些行为是否被正确实现。这个占位符类型称为&lt;strong&gt;测试替身&lt;/strong&gt;（test double）。mock对象是特定类型的测试替身。&lt;/p&gt;
&lt;p&gt;下面是我们想要测试的场景：编写一个记录某个值与最大值差距的库，并根据差距来发送消息，下面是代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; trait&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; send&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; msg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; LimitTracker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    max&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; LimitTracker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;where&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; LimitTracker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        LimitTracker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            max&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; set_value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;value &lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; percentage_of_max&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;value &lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; f64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;max &lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;as&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; f64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        if&lt;/span&gt;&lt;span&gt; percentage_of_max&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;            self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Error: You are over your quota!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; if&lt;/span&gt;&lt;span&gt; percentage_of_max&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;9&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;            self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;messenger&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;                .&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Urgent warning: You&amp;#39;ve used up over 90% of your quota!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; if&lt;/span&gt;&lt;span&gt; percentage_of_max&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;75&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;            self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;messenger&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;                .&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;send&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Warning: You&amp;#39;ve used up over 75% of your quota!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这些代码有一个&lt;code&gt;Massenger&lt;/code&gt; trait，它有一个&lt;code&gt;send&lt;/code&gt;方法，该方法接受一个字符串切片作为参数。这个trait是mock对象所要实现的接口库。然后我们要测试&lt;code&gt;LimitTracker&lt;/code&gt;的&lt;code&gt;set_value&lt;/code&gt;方法。&lt;/p&gt;
&lt;p&gt;下面是测试代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;cfg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; tests&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        sent_messages&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                sent_messages&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; send&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; message&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;            self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;sent_messages&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; it_sends_an_over_75_percent_warning_message&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; mock_messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; limit_tracker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; LimitTracker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;mock_messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        limit_tracker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;set_value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;mock_messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;sent_messages&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里定义了一个&lt;code&gt;MockMessenger&lt;/code&gt;结构体，它有一个&lt;code&gt;sent_messages&lt;/code&gt;字段，用于存储发送的消息。然后我们实现了&lt;code&gt;Messenger&lt;/code&gt; trait，它有一个&lt;code&gt;send&lt;/code&gt;方法，该方法接受一个字符串切片作为参数。这个方法将消息添加到&lt;code&gt;sent_messages&lt;/code&gt;字段中。这个将limit_tracker的value设置为80，然后我们断言&lt;code&gt;sent_messages&lt;/code&gt;字段中有一个消息。&lt;/p&gt;
&lt;p&gt;然而测试有问题，因为&lt;code&gt;send&lt;/code&gt;方法获取了&lt;code&gt;self&lt;/code&gt;的不可变引用，这是我们使用&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;来解决这个问题：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;cfg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; tests&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;cell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        sent_messages&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                sent_messages&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; send&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; message&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;            self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;sent_messages&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;borrow_mut&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; it_sends_an_over_75_percent_warning_message&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; mock_messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MockMessenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; limit_tracker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; LimitTracker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;mock_messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        limit_tracker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;set_value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;80&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;mock_messenger&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;sent_messages&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;borrow&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里&lt;code&gt;send_messages&lt;/code&gt;的字段类型是&lt;code&gt;RefCell&amp;lt;Vec&amp;lt;String&amp;gt;&amp;gt;&lt;/code&gt;而不是&lt;code&gt;Vec&amp;lt;String&amp;gt;&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;对于&lt;code&gt;send&lt;/code&gt;方法的实现，我们使用了&lt;code&gt;borrow_mut&lt;/code&gt;方法来获取&lt;code&gt;sent_messages&lt;/code&gt;字段的可变引用。这样我们就可以修改&lt;code&gt;sent_messages&lt;/code&gt;字段的值了。&lt;/p&gt;
&lt;p&gt;最后在&lt;code&gt;assert_eq!&lt;/code&gt;宏中，我们使用了&lt;code&gt;borrow&lt;/code&gt;方法来获取&lt;code&gt;sent_messages&lt;/code&gt;字段的不可变引用。这样我们就可以断言&lt;code&gt;sent_messages&lt;/code&gt;字段的值了。&lt;/p&gt;
&lt;h1 id=&quot;refcellzai-yun-xing-shi-ji-lu-jie-yong&quot;&gt;RefCell&lt;T&gt;在运行时记录借用&lt;a class=&quot;zola-anchor&quot; href=&quot;#refcellzai-yun-xing-shi-ji-lu-jie-yong&quot; aria-label=&quot;Anchor link for: refcellzai-yun-xing-shi-ji-lu-jie-yong&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;创建不可变和可变引用时，对&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;来说是使用&lt;code&gt;borrow&lt;/code&gt;和&lt;code&gt;borrow_mut&lt;/code&gt;方法。这两个方法都会返回一个&lt;code&gt;Ref&amp;lt;T&amp;gt;&lt;/code&gt;和&lt;code&gt;RefMut&amp;lt;T&amp;gt;&lt;/code&gt;，它们分别代表不可变和可变引用。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;会记录当前有多少活动的&lt;code&gt;Ref&amp;lt;T&amp;gt;&lt;/code&gt;和&lt;code&gt;RefMut&amp;lt;T&amp;gt;&lt;/code&gt;，&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;允许有多个不可变借用或一个可变借用。&lt;/p&gt;
&lt;h1 id=&quot;jie-he-rche-refcelllai-yong-you-duo-ge-ke-bian-shu-ju-suo-you-zhe&quot;&gt;结合Rc&lt;T&gt;和RefCell&lt;T&gt;来拥有多个可变数据所有者&lt;a class=&quot;zola-anchor&quot; href=&quot;#jie-he-rche-refcelllai-yong-you-duo-ge-ke-bian-shu-ju-suo-you-zhe&quot; aria-label=&quot;Anchor link for: jie-he-rche-refcelllai-yong-you-duo-ge-ke-bian-shu-ju-suo-you-zhe&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;允许对相同数据有多个所有者，不过只能提供不可变访问。一个储存了&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;的&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;可以得到多个所有者并且可以修改的值。下面是链表的例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;derive&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;cell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;    *&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;borrow_mut&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;a after = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;b after = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;c after = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里创建的一个&lt;code&gt;Rc&amp;lt;RefCell&amp;lt;i32&amp;gt;&amp;gt;&lt;/code&gt;实例储存在变量&lt;code&gt;value&lt;/code&gt;中，然后通过它创建了&lt;code&gt;a&lt;/code&gt;列表，用到了克隆使&lt;code&gt;a&lt;/code&gt;和&lt;code&gt;value&lt;/code&gt;都拥有内部&lt;code&gt;RefCell&amp;lt;i32&amp;gt;&lt;/code&gt;的所有权。&lt;/p&gt;
&lt;p&gt;同样将&lt;code&gt;a&lt;/code&gt;克隆到&lt;code&gt;b&lt;/code&gt;和&lt;code&gt;c&lt;/code&gt;中，然后我们使用&lt;code&gt;borrow_mut&lt;/code&gt;方法来获取&lt;code&gt;value&lt;/code&gt;的可变引用并将其值增加10(这里使用了自动解引用得到了&lt;code&gt;RefCell&amp;lt;i32&amp;gt;&lt;/code&gt;，然后调用&lt;code&gt;borrow_mut&lt;/code&gt;方法来获取&lt;code&gt;i32&lt;/code&gt;的可变引用，最后解引用后修改其值)。最后打印出&lt;code&gt;a&lt;/code&gt;、&lt;code&gt;b&lt;/code&gt;和&lt;code&gt;c&lt;/code&gt;的值，可以看到它们的值都被修改了。&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;我们创建了一个表面上不可变但实际可修改数据的数据结构，同时其规则也保护我们免于数据竞争。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-caution&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;🔥 谨慎&lt;/p&gt;&lt;p&gt;&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;不能用于多线程代码，将在后面讨论&lt;code&gt;Mutex&amp;lt;T&amp;gt;&lt;/code&gt;这个线程安全版本的&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;。&lt;/p&gt;
&lt;/div&gt;
</description>
      </item>
      <item>
          <title>Rust智能指针Rc&lt;T&gt;</title>
          <pubDate>Thu, 01 May 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-pointer-rc/</link>
          <guid>https://www.microrat.com/blog/rust-pointer-rc/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-pointer-rc/">&lt;p&gt;有的时候单个值会有多个所有者，例如图数据结构中，多个边可能指向相同的节点，节点在没有任何边指向它从而没有任何所有者之前，都不应该被清理掉。&lt;/p&gt;
&lt;p&gt;启用多所有权需要使用&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;，这是&lt;strong&gt;引用计数&lt;/strong&gt;（reference counting）的缩写，它记录了一个值的引用数量来知晓这个值是否仍在被使用，如果这个值有零个引用，就代表没有任何有效引用并可以被清理。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;用于我们希望在堆上面分配一些内存供程序多个部分读取，且无法在编译时确定程序的哪一个部分会最后结束使用它的时候。如果知道哪部分最后一个结束使用，就可以令其成为数据的所有者，正常的所有权规则就可以在编译时生效。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-caution&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;🔥 谨慎&lt;/p&gt;&lt;p&gt;&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;只能用于单线程场景，多线程场景将在后面介绍。&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&quot;shi-yong-rcgong-xiang-shu-ju&quot;&gt;使用Rc&lt;T&gt;共享数据&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-rcgong-xiang-shu-ju&quot; aria-label=&quot;Anchor link for: shi-yong-rcgong-xiang-shu-ju&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;假如我们想创建一个有共享所有权的列表，尝试使用&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码会报错，因为创建&lt;code&gt;b&lt;/code&gt;列表时，&lt;code&gt;a&lt;/code&gt;的所有权已经被移动，所以尝试使用&lt;code&gt;a&lt;/code&gt;创建&lt;code&gt;c&lt;/code&gt;时不被允许。&lt;/p&gt;
&lt;p&gt;可以改变&lt;code&gt;Cons&lt;/code&gt;的定义来存放一个引用，不过需要指定生命周期参数，这样可以使列表中每一个元素都至少与列表本身存在的一样久，然而并不是所有情况都是如此。&lt;/p&gt;
&lt;p&gt;下面我们使用&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;来解决这个问题：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;emum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; crate&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里创建&lt;code&gt;b&lt;/code&gt;时，不同于获取&lt;code&gt;a&lt;/code&gt;的所有权，而是克隆&lt;code&gt;a&lt;/code&gt;所包含的&lt;code&gt;Rc&amp;lt;List&amp;gt;&lt;/code&gt;，这会使引用计数从1增加到2并允许&lt;code&gt;b&lt;/code&gt;和&lt;code&gt;a&lt;/code&gt;共享&lt;code&gt;Rc&amp;lt;List&amp;gt;&lt;/code&gt;中的数据的所有权，创建&lt;code&gt;c&lt;/code&gt;时也一样。每次调用&lt;code&gt;Rc::clone&lt;/code&gt;时，引用计数就会增加1，知道有零个引用之前数据都不会被清理。&lt;/p&gt;
&lt;p&gt;这里先使用&lt;code&gt;use&lt;/code&gt;语句将&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;引入作用域，先创建&lt;code&gt;a&lt;/code&gt;，然后创建&lt;code&gt;b&lt;/code&gt;和&lt;code&gt;c&lt;/code&gt;，&lt;code&gt;Rc::clone&lt;/code&gt;接受一个&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;的引用并返回一个新的&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;。这里也可以调用&lt;code&gt;a.clone()&lt;/code&gt;而不是&lt;code&gt;Rc::clone(&amp;amp;a)&lt;/code&gt;，不过这里习惯是使用&lt;code&gt;Rc::clone&lt;/code&gt;。&lt;code&gt;Rc::clone&lt;/code&gt;不像大部分类型的&lt;code&gt;clone&lt;/code&gt;那样对所有数据进行深拷贝，而是增加了引用计数。这会节省很多时间。&lt;/p&gt;
&lt;h1 id=&quot;ke-long-rchui-zeng-jia-yin-yong-ji-shu&quot;&gt;克隆Rc&lt;T&gt;会增加引用计数&lt;a class=&quot;zola-anchor&quot; href=&quot;#ke-long-rchui-zeng-jia-yin-yong-ji-shu&quot; aria-label=&quot;Anchor link for: ke-long-rchui-zeng-jia-yin-yong-ji-shu&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;count after creating a = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;count after creating b = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;count after creating c = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;count after c goes out of scope = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;strong_count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码可以观察到引用计数的变化，这里通过调用&lt;code&gt;Rc::strong_count&lt;/code&gt;函数来获取引用计数。这个函数叫&lt;code&gt;strong_count&lt;/code&gt;而不是&lt;code&gt;count&lt;/code&gt;是因为&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;也有&lt;code&gt;weak_count&lt;/code&gt;这个函数。该代码会打印如下内容：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;count after creating a = 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;count after creating b = 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;count after creating c = 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;count after c goes out of scope = 2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，&lt;code&gt;a&lt;/code&gt;中初始的引用计数为1，后面每次调用&lt;code&gt;Rc::clone&lt;/code&gt;时，引用计数就会增加1，直到&lt;code&gt;c&lt;/code&gt;离开作用域时，引用计数就会减少1。不用像调用&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;一样调用函数来减少计数，因为&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;实现了&lt;code&gt;Drop&lt;/code&gt; trait，当&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;离开作用域时，引用计数就会减少1。&lt;/p&gt;
&lt;p&gt;在最后，&lt;code&gt;a&lt;/code&gt;和&lt;code&gt;b&lt;/code&gt;离开作用域时，引用计数会减少到0，同时&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;也会被完全清理。&lt;/p&gt;
&lt;p&gt;通过不可变引用，&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;可以允许程序的多个部分只读地共享数据，后面会介绍内部可变性模式和&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;类型，它可以与&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;结合使用来处理不可变性的限制。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Tauri项目搭建</title>
          <pubDate>Tue, 29 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/tauri-start/</link>
          <guid>https://www.microrat.com/blog/tauri-start/</guid>
          <description xml:base="https://www.microrat.com/blog/tauri-start/">&lt;p&gt;Tauri是一个用于构建跨平台桌面应用程序的框架，使用Web开发技术来构建前端界面，可以使用多种开发后端逻辑。它支持Windows、macOS和Linux等多个操作系统，提供了丰富的API和工具，方便开发者进行桌面应用程序的开发和部署。&lt;/p&gt;
&lt;p&gt;在开始前，首先需要安装系统依赖，还有Rust和Node.js，详细安装见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://tauri.app/start/prerequisites&quot;&gt;Prerequisites&lt;/a&gt;。&lt;/p&gt;
&lt;h1 id=&quot;chuang-jian-xiang-mu&quot;&gt;创建项目&lt;a class=&quot;zola-anchor&quot; href=&quot;#chuang-jian-xiang-mu&quot; aria-label=&quot;Anchor link for: chuang-jian-xiang-mu&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tauri几乎可以和所有的前端框架一起使用，&lt;code&gt;create-tauri-app&lt;/code&gt;是一个快速创建项目的工具。我们可以使用&lt;code&gt;create-tauri-app&lt;/code&gt;来创建一个Tauri项目，也可以手动去创建。&lt;/p&gt;
&lt;h2 id=&quot;shi-yong-create-tauri-app&quot;&gt;使用&lt;em&gt;create-tauri-app&lt;/em&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-create-tauri-app&quot; aria-label=&quot;Anchor link for: shi-yong-create-tauri-app&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这里使用&lt;code&gt;cargo&lt;/code&gt;来使用&lt;code&gt;create-tauri-app&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;cargo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; create-tauri-app&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-locked&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;cargo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; create-tauri-app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接着会按照提示选择项目的名称、前端语言、包管理器和前端模板，以及前端框架。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-tip&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;💡 提示&lt;/p&gt;&lt;p&gt;如果不清楚该如何选择，可以从原版模板开始：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前端语言：&lt;code&gt;TypeScript/JavaScript&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;包管理器：&lt;code&gt;pnpm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;UI模板：&lt;code&gt;vanilla&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;UI风格：&lt;code&gt;TypeScript&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id=&quot;qi-dong-kai-fa-fu-wu-qi&quot;&gt;启动开发服务器&lt;a class=&quot;zola-anchor&quot; href=&quot;#qi-dong-kai-fa-fu-wu-qi&quot; aria-label=&quot;Anchor link for: qi-dong-kai-fa-fu-wu-qi&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;创建完项目后，可以进入项目目录，然后使用&lt;code&gt;Tauri CLI&lt;/code&gt;启动开发服务器：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);font-style: italic;&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; tauri-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;pnpm&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; install&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;pnpm&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; tauri&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;shou-dong-she-zhi-tauri-cli&quot;&gt;手动设置（Tauri CLI）&lt;a class=&quot;zola-anchor&quot; href=&quot;#shou-dong-she-zhi-tauri-cli&quot; aria-label=&quot;Anchor link for: shou-dong-she-zhi-tauri-cli&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;希望自己设置项目，可以使用&lt;code&gt;Tauri CLI&lt;/code&gt;来创建项目。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;下面假定创建新项目，如果已经初始化了前端，则可以跳过第一步。&lt;/p&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;创建新目录并初始化前端，下面用&lt;code&gt;pnpm&lt;/code&gt;作为包管理器：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; tauri-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);font-style: italic;&quot;&gt;cd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; tauri-app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;pnpm&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; create&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; vite&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;使用包管理器安装Tauri的CLI工具，如果使用&lt;code&gt;cargo&lt;/code&gt;则需要全局安装，这里以&lt;code&gt;cargo&lt;/code&gt;为例：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;cargo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; tauri-cli&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-version&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;^2.0.0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-locked&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;确定前端开发服务器的URL，如果使用的是&lt;code&gt;Vite&lt;/code&gt;，则默认为&lt;code&gt;http://localhost:5173&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在项目目录中出实话Tauri：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;cargo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; tauri&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; init&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个时候会询问一些问题。
5. 启动开发服务器：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;cargo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; tauri&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</description>
      </item>
      <item>
          <title>Rust智能指针Box&lt;T&gt;</title>
          <pubDate>Mon, 28 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-pointer-box/</link>
          <guid>https://www.microrat.com/blog/rust-pointer-box/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-pointer-box/">&lt;p&gt;智能指针（smart pointers）是一类数据结构，&lt;code&gt;String&lt;/code&gt;和&lt;code&gt;Vec&lt;/code&gt;就是智能指针的例子。智能指针不同于结构体的地方在于，它实现了&lt;code&gt;Deref&lt;/code&gt; trait和&lt;code&gt;Drop&lt;/code&gt; trait。&lt;code&gt;Deref&lt;/code&gt; trait允许智能指针像引用一样使用，&lt;code&gt;Drop&lt;/code&gt; trait允许智能指针在离开作用域时自动执行一些操作。这里不会讲所有的智能指针，而是讲以下三个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt;，用在堆上分配值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt;，一个引用计数类型，其数据可以有多个所有者&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ref&amp;lt;T&amp;gt;&lt;/code&gt;和&lt;code&gt;RefMut&amp;lt;T&amp;gt;&lt;/code&gt;，通过&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt;访问&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;box&quot;&gt;Box&lt;T&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#box&quot; aria-label=&quot;Anchor link for: box&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;box是最简单直接的智能指针，它允许你将值放在堆上，而不是栈上，留在栈上的是指向堆数据的指针。&lt;/p&gt;
&lt;h2 id=&quot;shi-yong-boxzai-dui-shang-chu-cun-shu-ju&quot;&gt;使用Box&lt;T&gt;在堆上储存数据&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-boxzai-dui-shang-chu-cun-shu-ju&quot; aria-label=&quot;Anchor link for: shi-yong-boxzai-dui-shang-chu-cun-shu-ju&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;b = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这便是box的用法，这里定义了变量&lt;code&gt;b&lt;/code&gt;，其值为&lt;code&gt;5&lt;/code&gt;，&lt;code&gt;5&lt;/code&gt;被放在了堆上，&lt;code&gt;b&lt;/code&gt;是指向堆数据的指针。&lt;/p&gt;
&lt;h2 id=&quot;boxchuang-jian-di-gui-lei-xing&quot;&gt;Box创建递归类型&lt;a class=&quot;zola-anchor&quot; href=&quot;#boxchuang-jian-di-gui-lei-xing&quot; aria-label=&quot;Anchor link for: boxchuang-jian-di-gui-lei-xing&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;递归类型（recursive type）的值可以拥有另一个同类型的值作为其自身的一部分，但是Rust在编译时需要知道类型占用了多少空间，而递归类型可以无限地递归下去，所以不知道需要多少空间。因为box有已知的大小，所以通过在循环类型定义中插入box就可以创建递归类型了。&lt;/p&gt;
&lt;p&gt;下面探索一下一个递归类型的例子&lt;em&gt;cons list&lt;/em&gt;，这个数据类型有两个参数，一个是值，一个是另一个&lt;em&gt;cons list&lt;/em&gt;，最后一项包含一个叫&lt;code&gt;Nil&lt;/code&gt;的特殊值，代表列表终止：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的代码还不能编译，因为这个类型没有已知的大小。而使用box就可以解决这个问题，因为box作为一个指针有已知的大小：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; List&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Cons&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Nil&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;shi-yong-deref-traitjiang-zhi-neng-zhi-zhen-dang-zuo-chang-gui-yin-yong-chu-li&quot;&gt;使用Deref trait将智能指针当作常规引用处理&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-deref-traitjiang-zhi-neng-zhi-zhen-dang-zuo-chang-gui-yin-yong-chu-li&quot; aria-label=&quot;Anchor link for: shi-yong-deref-traitjiang-zhi-neng-zhi-zhen-dang-zuo-chang-gui-yin-yong-chu-li&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;实现&lt;code&gt;Deref&lt;/code&gt; trait允许我们重载&lt;code&gt;*&lt;/code&gt;运算符，使得智能指针可以像引用一样使用。&lt;/p&gt;
&lt;h2 id=&quot;zhui-zong-zhi-zhen-de-zhi&quot;&gt;追踪指针的值&lt;a class=&quot;zola-anchor&quot; href=&quot;#zhui-zong-zhi-zhen-de-zhi&quot; aria-label=&quot;Anchor link for: zhui-zong-zhi-zhen-de-zhi&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;常规引用是一个指针类型：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; *&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里创建了一个变量&lt;code&gt;x&lt;/code&gt;，其值为&lt;code&gt;5&lt;/code&gt;，然后创建了一个指向&lt;code&gt;x&lt;/code&gt;的引用&lt;code&gt;y&lt;/code&gt;，使用&lt;code&gt;*y&lt;/code&gt;可以获取&lt;code&gt;y&lt;/code&gt;指向的值。如果尝试编写&lt;code&gt;assert_eq!(5, y);&lt;/code&gt;，会报错，因为不允许比较数字的引用与数字，它们是不同的类型。&lt;/p&gt;
&lt;h2 id=&quot;xiang-yin-yong-yi-yang-shi-yong-box&quot;&gt;像引用一样使用Box&lt;T&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#xiang-yin-yong-yi-yang-shi-yong-box&quot; aria-label=&quot;Anchor link for: xiang-yin-yong-yi-yang-shi-yong-box&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;可以使用&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt;替代引用来重写上面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; *&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码与上面的代码的不同之处在于将&lt;code&gt;y&lt;/code&gt;设置为一个指向&lt;code&gt;x&lt;/code&gt;值拷贝的&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt;实例。&lt;/p&gt;
&lt;h2 id=&quot;zi-ding-yi-zhi-neng-zhi-zhen&quot;&gt;自定义智能指针&lt;a class=&quot;zola-anchor&quot; href=&quot;#zi-ding-yi-zhi-neng-zhi-zhen&quot; aria-label=&quot;Anchor link for: zi-ding-yi-zhi-neng-zhi-zhen&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;下面我们创建一个类似于标准库中&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt;类型的智能指针：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MyBox&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MyBox&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MyBox&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        MyBox&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码定义了一个结构体&lt;code&gt;MyBox&amp;lt;T&amp;gt;&lt;/code&gt;，它包含一个泛型类型&lt;code&gt;T&lt;/code&gt;，是一个元组，并实现了一个名为&lt;code&gt;new&lt;/code&gt;的方法，该方法接受一个类型为&lt;code&gt;T&lt;/code&gt;的值，并返回一个&lt;code&gt;MyBox&amp;lt;T&amp;gt;&lt;/code&gt;实例。&lt;/p&gt;
&lt;p&gt;下面尝试使用&lt;code&gt;MyBox&amp;lt;T&amp;gt;&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MyBox&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; *&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码不能编译，因为&lt;code&gt;MyBox&amp;lt;T&amp;gt;&lt;/code&gt;不能解引用，为了使用&lt;code&gt;*&lt;/code&gt;运算符，需要实现&lt;code&gt;Deref&lt;/code&gt; trait。&lt;/p&gt;
&lt;h2 id=&quot;shi-xian-deref-trait&quot;&gt;实现Deref trait&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-xian-deref-trait&quot; aria-label=&quot;Anchor link for: shi-xian-deref-trait&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;实现&lt;code&gt;Deref&lt;/code&gt; trait由标准库提供，要求实现名为&lt;code&gt;deref&lt;/code&gt;的方法，该方法借用&lt;code&gt;self&lt;/code&gt;返回一个指向内部值的引用：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;ops&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Deref&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Deref&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MyBox&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Target&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; deref&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Target&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;        &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;type Target = T;&lt;/code&gt;关联类型，这里先不做解释，&lt;code&gt;deref&lt;/code&gt;方法返回一个指向内部值的引用，编译器就可以使用&lt;code&gt;*&lt;/code&gt;运算符了，事实上当我们输入&lt;code&gt;*y&lt;/code&gt;时，编译器会运行&lt;code&gt;*(y.deref())&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;deref&lt;/code&gt;返回引用的原因是如果返回值，则所有权会被移出，一般情况下我们不希望获取&lt;code&gt;MyBox&amp;lt;T&amp;gt;&lt;/code&gt;内部值的所有权。&lt;/p&gt;
&lt;h2 id=&quot;han-shu-he-fang-fa-de-yin-shi-derefqiang-zhi-zhuan-huan&quot;&gt;函数和方法的隐式Deref强制转换&lt;a class=&quot;zola-anchor&quot; href=&quot;#han-shu-he-fang-fa-de-yin-shi-derefqiang-zhi-zhuan-huan&quot; aria-label=&quot;Anchor link for: han-shu-he-fang-fa-de-yin-shi-derefqiang-zhi-zhuan-huan&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Deref强制转换（Deref coercions）将实现了&lt;code&gt;Deref&lt;/code&gt; trait的类型的引用转换为另一种类型的引用。例如&lt;code&gt;&amp;amp;String&lt;/code&gt;转换为&lt;code&gt;&amp;amp;str&lt;/code&gt;。当这种特定类型的引用作为实参传递给和形参类型不同的函数或方法时将自动进行。&lt;/p&gt;
&lt;p&gt;Deref强制转换使得Rust程序员编写函数和方法调用时无需增加过多显式使用&lt;code&gt;&amp;amp;&lt;/code&gt;和&lt;code&gt;*&lt;/code&gt;的引用和解引用。&lt;/p&gt;
&lt;p&gt;下面是一个例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; hello&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Hello, &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MyBox&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Rust&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    hello&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里&lt;code&gt;&amp;amp;m&lt;/code&gt;的类型是&lt;code&gt;&amp;amp;MyBox&amp;lt;String&amp;gt;&lt;/code&gt;，而&lt;code&gt;hello&lt;/code&gt;函数的形参类型是&lt;code&gt;&amp;amp;str&lt;/code&gt;，所以编译器会自动将&lt;code&gt;&amp;amp;m&lt;/code&gt;转换为&lt;code&gt;&amp;amp;String&lt;/code&gt;，然后再转换为&lt;code&gt;&amp;amp;str&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果没有实现Deref强制转换，则需要这样写：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; hello&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Hello, &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; MyBox&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Rust&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    hello&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里先使用&lt;code&gt;*&lt;/code&gt;运算符获取&lt;code&gt;MyBox&amp;lt;String&amp;gt;&lt;/code&gt;的值，然后使用&lt;code&gt;&amp;amp;&lt;/code&gt;和&lt;code&gt;[]&lt;/code&gt;运算符获取字符串的切片，最后将切片传递给&lt;code&gt;hello&lt;/code&gt;函数。&lt;/p&gt;
&lt;h2 id=&quot;derefqiang-zhi-zhuan-huan-ru-he-yu-ke-bian-xing-jiao-hu&quot;&gt;Deref强制转换如何与可变性交互&lt;a class=&quot;zola-anchor&quot; href=&quot;#derefqiang-zhi-zhuan-huan-ru-he-yu-ke-bian-xing-jiao-hu&quot; aria-label=&quot;Anchor link for: derefqiang-zhi-zhuan-huan-ru-he-yu-ke-bian-xing-jiao-hu&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;类似&lt;code&gt;Deref&lt;/code&gt; trait，标准库还提供了&lt;code&gt;DerefMut&lt;/code&gt; trait，用于在可变引用上进行Deref强制转换。&lt;/p&gt;
&lt;p&gt;Rust会在下面三种情况时进行Deref强制转换：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当&lt;code&gt;T: Deref&amp;lt;Target=U&amp;gt;&lt;/code&gt;时，从&lt;code&gt;&amp;amp;T&lt;/code&gt;到&lt;code&gt;&amp;amp;U&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;当&lt;code&gt;T: DerefMut&amp;lt;Target=U&amp;gt;&lt;/code&gt;时，从&lt;code&gt;&amp;amp;mut T&lt;/code&gt;到&lt;code&gt;&amp;amp;mut U&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;当&lt;code&gt;T: Deref&amp;lt;Target=U&amp;gt;&lt;/code&gt;时，从&lt;code&gt;&amp;amp;mut T&lt;/code&gt;到&lt;code&gt;&amp;amp;U&lt;/code&gt;
Rust可以将可变引用转换为不可变引用，但是不能将不可变引用转换为可变引用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;shi-yong-drop-traityun-xing-qing-li-dai-ma&quot;&gt;使用Drop trait运行清理代码&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-drop-traityun-xing-qing-li-dai-ma&quot; aria-label=&quot;Anchor link for: shi-yong-drop-traityun-xing-qing-li-dai-ma&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;对于智能指针第二个重要的trait是&lt;code&gt;Drop&lt;/code&gt; trait，它允许我们在值离开作用域时运行一些代码。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Drop&lt;/code&gt; trait定义了一个名为&lt;code&gt;drop&lt;/code&gt;的方法，该方法接受一个&lt;code&gt;self&lt;/code&gt;可变引用，这里为了能看出何时调用&lt;code&gt;drop&lt;/code&gt;方法，我们使用&lt;code&gt;println!&lt;/code&gt;语句实现&lt;code&gt;drop&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; CustomSmartPointer&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Drop&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; CustomSmartPointer&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; drop&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Dropping CustomSmartPointer with data `&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;`!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; CustomSmartPointer&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;my stuff&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; d&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; CustomSmartPointer&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;other stuff&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;CustomSmartPointers created.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Drop&lt;/code&gt; trait包含在prelude中，所以无需导入，输出如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CustomSmartPointers created.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Dropping CustomSmartPointer with data `other stuff`!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Dropping CustomSmartPointer with data `my stuff`!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看到，当&lt;code&gt;c&lt;/code&gt;和&lt;code&gt;d&lt;/code&gt;离开作用域时，&lt;code&gt;drop&lt;/code&gt;方法被调用，并且&lt;code&gt;data&lt;/code&gt;字段的值也被打印出来。变量以被创建时相反的顺序被丢弃。&lt;/p&gt;
&lt;h2 id=&quot;tong-guo-std-men-dropti-qian-diu-qi-zhi&quot;&gt;通过&lt;strong&gt;std::men::drop&lt;/strong&gt;提前丢弃值&lt;a class=&quot;zola-anchor&quot; href=&quot;#tong-guo-std-men-dropti-qian-diu-qi-zhi&quot; aria-label=&quot;Anchor link for: tong-guo-std-men-dropti-qian-diu-qi-zhi&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;有些时候需要提前清理某个值Rust不允许我们主动调用Drop trait的&lt;code&gt;drop&lt;/code&gt;方法，而是可以使用&lt;code&gt;std::men::drop&lt;/code&gt;函数，该函数接受一个值并调用其Drop trait的&lt;code&gt;drop&lt;/code&gt;方法：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; CustomSmartPointer&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;some data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;CustomSmartPointer created.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    drop&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;CustomSmartPointer dropped before the end of main.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CustomSmartPointer created.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Dropping CustomSmartPointer with data `some data`!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CustomSmartPointer dropped before the end of main.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;std::men::drop&lt;/code&gt;位于prelude中，所以无需导入。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;Rust不允许我们显式调用Drop trait的&lt;code&gt;drop&lt;/code&gt;方法，因为Rust会在&lt;code&gt;main&lt;/code&gt;结尾对值自动调用&lt;code&gt;drop&lt;/code&gt;方法，这会导致一个&lt;em&gt;double free&lt;/em&gt;错误，因为Rust会尝试清理相同的值两次。&lt;/p&gt;
&lt;/div&gt;
</description>
      </item>
      <item>
          <title>matplotlib简单入门</title>
          <pubDate>Sun, 27 Apr 2025 14:00:00 +0800</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/matplotlib-quickstart/</link>
          <guid>https://www.microrat.com/blog/matplotlib-quickstart/</guid>
          <description xml:base="https://www.microrat.com/blog/matplotlib-quickstart/">&lt;h1 id=&quot;figurezu-cheng&quot;&gt;Figure组成&lt;a class=&quot;zola-anchor&quot; href=&quot;#figurezu-cheng&quot; aria-label=&quot;Anchor link for: figurezu-cheng&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Matplotlib是一个Python的绘图库，它在&lt;code&gt;Figure&lt;/code&gt;上绘制图像，每个&lt;code&gt;Figure&lt;/code&gt;可以包含多个&lt;code&gt;Axes&lt;/code&gt;，每个&lt;code&gt;Axes&lt;/code&gt;可以理解为一幅图。&lt;/p&gt;
&lt;h2 id=&quot;figure&quot;&gt;Figure&lt;a class=&quot;zola-anchor&quot; href=&quot;#figure&quot; aria-label=&quot;Anchor link for: figure&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Figure是整个图形的容器，一般使用下面函数之一创建一个Figure：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;figure&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;             #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; an empty figure with no Axes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;       #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; a figure with a single Axes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; a figure with a 2x2 grid of Axes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; a figure with one Axes on the left, and two on the right:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplot_mosaic&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;right_top&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;                               [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;right_bottom&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;axes&quot;&gt;Axes&lt;a class=&quot;zola-anchor&quot; href=&quot;#axes&quot; aria-label=&quot;Anchor link for: axes&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Axes是一个具有数据空间的图像区域，每个Axes都有一个标题（&lt;code&gt;set_title()&lt;/code&gt;）、一个x轴标签（&lt;code&gt;set_xlabel()&lt;/code&gt;）和一个y轴标签（&lt;code&gt;set_ylabel()&lt;/code&gt;）。Axes是绘图的主要部分。&lt;/p&gt;
&lt;h2 id=&quot;axis&quot;&gt;Axis&lt;a class=&quot;zola-anchor&quot; href=&quot;#axis&quot; aria-label=&quot;Anchor link for: axis&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Axis设置刻度和限制，并有刻度和刻度标签，刻度位置由&lt;code&gt;Locator&lt;/code&gt;确定，刻度标签由&lt;code&gt;Formatter&lt;/code&gt;确定。&lt;/p&gt;
&lt;h2 id=&quot;artist&quot;&gt;Artist&lt;a class=&quot;zola-anchor&quot; href=&quot;#artist&quot; aria-label=&quot;Anchor link for: artist&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在&lt;code&gt;Figure&lt;/code&gt;上绘制的所有对象都是&lt;code&gt;Artist&lt;/code&gt;，&lt;code&gt;Artist&lt;/code&gt;包括&lt;code&gt;Axes&lt;/code&gt;、&lt;code&gt;Axis&lt;/code&gt;、&lt;code&gt;Line2D&lt;/code&gt;等。&lt;/p&gt;
&lt;h1 id=&quot;hui-tu-han-shu-shu-ru&quot;&gt;绘图函数输入&lt;a class=&quot;zola-anchor&quot; href=&quot;#hui-tu-han-shu-shu-ru&quot; aria-label=&quot;Anchor link for: hui-tu-han-shu-shu-ru&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;绘图函数的输入一般来讲是&lt;code&gt;numpy.array&lt;/code&gt;或&lt;code&gt;numpy.ma.masked_array&lt;/code&gt;，或是其他可以传递给&lt;code&gt;numpy.array&lt;/code&gt;的对象。若是像&lt;code&gt;numpy.matrix&lt;/code&gt;和&lt;code&gt;pandas&lt;/code&gt;的数据对象一般需要先转换为&lt;code&gt;numpy.array&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;matrix&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;b_asarray&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;asarray&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大多数方法还能解析可字符串索引的对象，例如&lt;em&gt;dict&lt;/em&gt;，&lt;em&gt;structured numpy array&lt;/em&gt;或&lt;em&gt;pandas.DataFrame&lt;/em&gt;，提供数据的索引作为&lt;code&gt;x&lt;/code&gt;和&lt;code&gt;y&lt;/code&gt;参数：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;seed&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;19680801&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; seed the random number generator.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;:&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;arange&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;        &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;:&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;randint&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;        &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;d&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;:&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;randn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);font-style: italic;&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; *&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;randn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);font-style: italic;&quot;&gt;d&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;abs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);font-style: italic;&quot;&gt;d&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;constrained&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;scatter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;d&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_xlabel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;entry a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_ylabel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;entry b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/inputs.svg&quot; alt=&quot;inputs&quot; title=&quot;inputs&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
上面代码先创建了一个叫&lt;code&gt;data&lt;/code&gt;的&lt;code&gt;dict&lt;/code&gt;，装了&lt;code&gt;a&lt;/code&gt;，&lt;code&gt;b&lt;/code&gt;，&lt;code&gt;c&lt;/code&gt;，&lt;code&gt;d&lt;/code&gt;四个数组，然后使用&lt;code&gt;scatter&lt;/code&gt;函数绘制散点图，&lt;code&gt;x&lt;/code&gt;和&lt;code&gt;y&lt;/code&gt;参数分别是&lt;code&gt;a&lt;/code&gt;和&lt;code&gt;b&lt;/code&gt;，&lt;code&gt;color&lt;/code&gt;参数是&lt;code&gt;c&lt;/code&gt;，&lt;code&gt;size&lt;/code&gt;参数是&lt;code&gt;d&lt;/code&gt;。&lt;/p&gt;
&lt;h1 id=&quot;dai-ma-feng-ge&quot;&gt;代码风格&lt;a class=&quot;zola-anchor&quot; href=&quot;#dai-ma-feng-ge&quot; aria-label=&quot;Anchor link for: dai-ma-feng-ge&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;xian-shi-jie-kou-he-yin-shi-jie-kou&quot;&gt;显示接口和隐示接口&lt;a class=&quot;zola-anchor&quot; href=&quot;#xian-shi-jie-kou-he-yin-shi-jie-kou&quot; aria-label=&quot;Anchor link for: xian-shi-jie-kou-he-yin-shi-jie-kou&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;有两种使用Matplotlib的方法，一种是显式创建&lt;code&gt;Figures&lt;/code&gt;和&lt;code&gt;Axes&lt;/code&gt;，然后调用它们的方法（OO风格），例如&lt;code&gt;ax.plot(x, y)&lt;/code&gt;，另一种是使用pyplot的隐式接口，例如&lt;code&gt;plt.plot(x, y)&lt;/code&gt;，这种方法会自动创建&lt;code&gt;Figures&lt;/code&gt;和&lt;code&gt;Axes&lt;/code&gt;，然后调用它们的方法（pyplot风格）。&lt;/p&gt;
&lt;p&gt;第一种如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;linspace&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; Sample data.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; Note that even in the OO-style, we use `.pyplot.figure` to create the Figure.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;constrained&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;linear&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; Plot some data on the Axes.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;quadratic&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; Plot more data on the Axes...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;cubic&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; ... and some more.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_xlabel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;x label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; Add an x-label to the Axes.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_ylabel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;y label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; Add a y-label to the Axes.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Simple Plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; Add a title to the Axes.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;legend&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; Add a legend.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;第二种如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;linspace&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; Sample data.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;figure&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;constrained&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;linear&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; Plot some data on the (implicit) Axes.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;quadratic&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; etc.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;cubic&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;xlabel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;x label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;ylabel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;y label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Simple Plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;legend&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外还有第三种方法，用于将Matplotlib嵌入GUI应用程序中，但这种方法不常用。&lt;/p&gt;
&lt;p&gt;一般来说，在复杂的项目中建议使用OO风格，而在需要快速交互工作时，pyplot风格会很方便。&lt;/p&gt;
&lt;h2 id=&quot;chuang-jian-fu-zhu-han-shu&quot;&gt;创建辅助函数&lt;a class=&quot;zola-anchor&quot; href=&quot;#chuang-jian-fu-zhu-han-shu&quot; aria-label=&quot;Anchor link for: chuang-jian-fu-zhu-han-shu&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;可以写函数来简化我们的操作：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; my_plotter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; param_dict&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;    A helper function to make a graph.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    out&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; **&lt;/span&gt;&lt;span&gt;param_dict&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    return&lt;/span&gt;&lt;span&gt; out&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;randn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; make 4 random data sets&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; (&lt;/span&gt;&lt;span&gt;ax1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;my_plotter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;ax1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;marker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;my_plotter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;ax2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;marker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;o&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里定义了一个函数&lt;code&gt;my_plotter&lt;/code&gt;，然后绘制了两个图。&lt;/p&gt;
&lt;h1 id=&quot;artistsfeng-ge&quot;&gt;Artists风格&lt;a class=&quot;zola-anchor&quot; href=&quot;#artistsfeng-ge&quot; aria-label=&quot;Anchor link for: artistsfeng-ge&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;对于Artists的样式选择，可以在绘图时指定，也可以在绘图使用setter指定：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;arange&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;cumsum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; color&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; linewidth&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; linestyle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;l&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;cumsum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; color&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;orange&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; linewidth&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;l&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_linestyle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/linestyles.svg&quot; alt=&quot;linestyles&quot; title=&quot;linestyles&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
这里第一条线在绘图时指定了&lt;code&gt;linestyle&lt;/code&gt;，第二条线在绘图后使用&lt;code&gt;set_linestyle&lt;/code&gt;指定了&lt;code&gt;linestyle&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&quot;yan-se&quot;&gt;颜色&lt;a class=&quot;zola-anchor&quot; href=&quot;#yan-se&quot; aria-label=&quot;Anchor link for: yan-se&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;对于颜色的定义，参照&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/users/explain/colors/colors.html&quot;&gt;Specifying colors&lt;/a&gt;，对于一个&lt;code&gt;scatter&lt;/code&gt;，标记边缘和内部可以是不同颜色：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;scatter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; facecolor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;C0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; edgecolor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;k&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/colors.svg&quot; alt=&quot;colors&quot; title=&quot;colors&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;xian-kuan-xian-xing-he-biao-ji-da-xiao&quot;&gt;线宽、线型和标记大小&lt;a class=&quot;zola-anchor&quot; href=&quot;#xian-kuan-xian-xing-he-biao-ji-da-xiao&quot; aria-label=&quot;Anchor link for: xian-kuan-xian-xing-he-biao-ji-da-xiao&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;线宽一般是以点为单位，用于有线条的Artists，线型的定义参照&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/gallery/lines_bars_and_markers/linestyles.html&quot;&gt;Linestyles&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;标记的大小取决于绘图的方法，&lt;code&gt;plot&lt;/code&gt;大小是一个点，&lt;code&gt;scatter&lt;/code&gt;大小与可视区域成比例。标记的样式定义可以参照&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/api/markers_api.html&quot;&gt;matplotlib.markers&lt;/a&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;o&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;d&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;data3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;data4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;legend&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/markersizes.svg&quot; alt=&quot;markersizes&quot; title=&quot;markersizes&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;biao-qian&quot;&gt;标签&lt;a class=&quot;zola-anchor&quot; href=&quot;#biao-qian&quot; aria-label=&quot;Anchor link for: biao-qian&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;axesbiao-qian-he-wen-ben&quot;&gt;Axes标签和文本&lt;a class=&quot;zola-anchor&quot; href=&quot;#axesbiao-qian-he-wen-ben&quot; aria-label=&quot;Anchor link for: axesbiao-qian-he-wen-ben&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;用&lt;code&gt;set_xlabel&lt;/code&gt;、&lt;code&gt;set_ylabel&lt;/code&gt;和&lt;code&gt;set_title&lt;/code&gt;在指定位置添加文本，也可以用&lt;code&gt;text&lt;/code&gt;添加文本到绘图中（详细见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/users/explain/text/text_intro.html&quot;&gt;Text in Matplotlib&lt;/a&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mu&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; sigma&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 115&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 15&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; mu&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span&gt; sigma&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; *&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;randn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;10000&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;constrained&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; the histogram of the data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; bins&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; patches&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;hist&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; density&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; facecolor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;C0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; alpha&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0.75&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_xlabel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Length [cm]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_ylabel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Probability&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Aardvark lengths&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);&quot;&gt;\n&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; (not really)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;text&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;75&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; .025&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);font-style: italic;&quot;&gt; r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);&quot;&gt;\m&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;u=115,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);&quot;&gt;\ &lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;igma=15&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;axis&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;55&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 175&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 0.03&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;grid&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/text.svg&quot; alt=&quot;text&quot; title=&quot;text&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
所有函数&lt;code&gt;text&lt;/code&gt;方法都会返回一个&lt;code&gt;matplotlib.text.Text&lt;/code&gt;实例，可以通过传入参数来改变文本样式（详细见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/users/explain/text/text_props.html&quot;&gt;Text properties and layout&lt;/a&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;t&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_xlabel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;my data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; fontsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; color&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;red&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;zai-wen-ben-zhong-shi-yong-shu-xue-biao-da-shi&quot;&gt;在文本中使用数学表达式&lt;a class=&quot;zola-anchor&quot; href=&quot;#zai-wen-ben-zhong-shi-yong-shu-xue-biao-da-shi&quot; aria-label=&quot;Anchor link for: zai-wen-ben-zhong-shi-yong-shu-xue-biao-da-shi&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Matplotlib支持TeX数学表达式，使用&lt;code&gt;$&lt;/code&gt;来表示数学表达式：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);font-style: italic;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;\s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;igma_i=15&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的&lt;code&gt;r&lt;/code&gt;前缀表示里面内容是原始字符串而不是将反斜杠视为Python转义。Matplotlib内置有TeX表达式解析器和输出引擎，另外也可以使用LaTeX来进行文本渲染（详细见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/users/explain/text/usetex.html&quot;&gt;Text rendering with LaTeX&lt;/a&gt;）。&lt;/p&gt;
&lt;h2 id=&quot;fu-zhu&quot;&gt;附注&lt;a class=&quot;zola-anchor&quot; href=&quot;#fu-zhu&quot; aria-label=&quot;Anchor link for: fu-zhu&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;注释某个点，通常是用箭头指向该点，然后连接到一处文本：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;t&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;arange&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0.0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5.0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 0.01&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;cos&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; *&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;pi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; *&lt;/span&gt;&lt;span&gt; t&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;line&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; lw&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;annotate&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;local max&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; xy&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; xytext&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1.5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;            arrowprops&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);font-style: italic;&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;facecolor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;black&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; shrink&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0.05&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_ylim&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/annotations.svg&quot; alt=&quot;annotations&quot; title=&quot;annotations&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
这个实例，使用&lt;code&gt;annotate&lt;/code&gt;方法添加了一个指向&lt;code&gt;(2, 1)&lt;/code&gt;的箭头，箭头连接到&lt;code&gt;(3, 1.5)&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&quot;tu-li&quot;&gt;图例&lt;a class=&quot;zola-anchor&quot; href=&quot;#tu-li&quot; aria-label=&quot;Anchor link for: tu-li&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一般我们使用&lt;code&gt;legend&lt;/code&gt;方法来添加图例（详细见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/users/explain/axes/legend_guide.html&quot;&gt;Legend guide&lt;/a&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;arange&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;arange&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;arange&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;d&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;data3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;legend&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/legends.svg&quot; alt=&quot;legends&quot; title=&quot;legends&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;axiske-du&quot;&gt;Axis刻度&lt;a class=&quot;zola-anchor&quot; href=&quot;#axiske-du&quot; aria-label=&quot;Anchor link for: axiske-du&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;每个Axes都有两个或三个&lt;code&gt;Axis&lt;/code&gt;对象，这些参数控制Axis的缩放、刻度定位和刻度格式。&lt;/p&gt;
&lt;h2 id=&quot;scales&quot;&gt;Scales&lt;a class=&quot;zola-anchor&quot; href=&quot;#scales&quot; aria-label=&quot;Anchor link for: scales&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;除了线性刻度，Matplotlib还提供了非线性刻度（例如对数刻度），有&lt;code&gt;loglog&lt;/code&gt;、&lt;code&gt;semilogx&lt;/code&gt;、&lt;code&gt;semilogy&lt;/code&gt;等众多方法（详见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/gallery/scales/scales.html&quot;&gt;Scales overview&lt;/a&gt;）。这里我们手动设置：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;constrained&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;xdata&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;arange&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; make an ordinal for this&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;**&lt;/span&gt;&lt;span&gt;data1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;xdata&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_yscale&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;xdata&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/scales.svg&quot; alt=&quot;scales&quot; title=&quot;scales&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
这里将第二幅图的y轴设置为对数刻度。&lt;/p&gt;
&lt;h2 id=&quot;tick&quot;&gt;Tick&lt;a class=&quot;zola-anchor&quot; href=&quot;#tick&quot; aria-label=&quot;Anchor link for: tick&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;每个&lt;code&gt;Axis&lt;/code&gt;都有一个刻度定位和格式化工具用于选择刻度线和标签，这里一个简单的接口是&lt;code&gt;set_xticks&lt;/code&gt;和&lt;code&gt;set_yticks&lt;/code&gt;（详细见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/gallery/ticks/tick-locators.html&quot;&gt;Tick locators&lt;/a&gt;和&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/gallery/ticks/tick-formatters.html&quot;&gt;Tick formatters&lt;/a&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;constrained&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;xdata&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Automatic ticks&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;xdata&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_xticks&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;arange&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 30&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;zero&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;sixty&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;90&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_yticks&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1.5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1.5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; note that we don&amp;#39;t need to specify labels&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Manual ticks&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/tick.svg&quot; alt=&quot;tick&quot; title=&quot;tick&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
这里的第二幅图使用&lt;code&gt;set_xticks&lt;/code&gt;和&lt;code&gt;set_yticks&lt;/code&gt;手动设置了刻度线位置和标签。&lt;/p&gt;
&lt;h2 id=&quot;dates-and-strings&quot;&gt;dates and strings&lt;a class=&quot;zola-anchor&quot; href=&quot;#dates-and-strings&quot; aria-label=&quot;Anchor link for: dates-and-strings&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;对于日期，可以使用&lt;code&gt;matplotlib.dates&lt;/code&gt;模块来处理日期，例如（详细见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/gallery/text_labels_and_annotations/date.html&quot;&gt;Date tick labels&lt;/a&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;from&lt;/span&gt;&lt;span&gt; matplotlib&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;dates&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; import&lt;/span&gt;&lt;span&gt; ConciseDateFormatter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;constrained&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dates&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;arange&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;datetime64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;2021-11-15&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;datetime64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;2021-12-25&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                  np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;timedelta64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;h&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;cumsum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;randn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;dates&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;dates&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;xaxis&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_major_formatter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;ConciseDateFormatter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;xaxis&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;get_major_locator&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/dates.svg&quot; alt=&quot;dates&quot; title=&quot;dates&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
这里&lt;code&gt;dates&lt;/code&gt;生成了从&lt;code&gt;2021-11-15&lt;/code&gt;到&lt;code&gt;2021-12-25&lt;/code&gt;每个小时的日期序列，而&lt;code&gt;data&lt;/code&gt;是根据&lt;code&gt;dates&lt;/code&gt;生成的随机数据。&lt;/p&gt;
&lt;p&gt;对于字符串，我们使用分类绘图（详细见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/gallery/lines_bars_and_markers/categorical_variables.html&quot;&gt;Plotting categorical variables&lt;/a&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;constrained&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;turnips&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;rutabaga&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;cucumber&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;pumpkins&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;bar&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;rand&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/strings.svg&quot; alt=&quot;strings&quot; title=&quot;strings&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
&lt;h2 id=&quot;qi-ta-zhou-dui-xiang&quot;&gt;其他轴对象&lt;a class=&quot;zola-anchor&quot; href=&quot;#qi-ta-zhou-dui-xiang&quot; aria-label=&quot;Anchor link for: qi-ta-zhou-dui-xiang&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;有些时候可能还需要额外的轴，这时可以使用&lt;code&gt;twinx&lt;/code&gt;和&lt;code&gt;twiny&lt;/code&gt;添加一副新图（详细见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/gallery/subplots_axes_and_figures/two_scales.html&quot;&gt;Plots with different scales&lt;/a&gt;），或使用&lt;code&gt;secondary_xaxis&lt;/code&gt;和&lt;code&gt;secondary_yaxis&lt;/code&gt;（详细见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/gallery/subplots_axes_and_figures/secondary_axis.html&quot;&gt;Secondary Axis&lt;/a&gt;）添加一个新轴：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; (&lt;/span&gt;&lt;span&gt;ax1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ax3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; figsize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2.7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;constrained&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;l1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; ax1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; ax1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;twinx&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;l2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; ax2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;C1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;legend&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span&gt;l1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; l2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Sine (left)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Straight (right)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_xlabel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Angle [rad]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; ax3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;secondary_xaxis&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; (&lt;/span&gt;&lt;span&gt;np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;rad2deg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;deg2rad&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ax4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_xlabel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Angle [°]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/axis.svg&quot; alt=&quot;axis&quot; title=&quot;axis&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
这里的第一幅图使用&lt;code&gt;twiny&lt;/code&gt;添加了一个新图，第二幅图使用&lt;code&gt;secondary_xaxis&lt;/code&gt;添加了一个新轴。&lt;/p&gt;
&lt;h1 id=&quot;yan-se-ying-she-shu-ju&quot;&gt;颜色映射数据&lt;a class=&quot;zola-anchor&quot; href=&quot;#yan-se-ying-she-shu-ju&quot; aria-label=&quot;Anchor link for: yan-se-ying-she-shu-ju&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;有时希望用颜色来表示第三个维度，在Matplotlib中有很多绘图类型可以做到这一点：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;from&lt;/span&gt;&lt;span&gt; matplotlib&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span&gt;colors&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; import&lt;/span&gt;&lt;span&gt; LogNorm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;X&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; Y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;meshgrid&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;linspace&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 128&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;linspace&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 128&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Z&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&lt;/span&gt;&lt;span&gt; X&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span&gt; X&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span&gt; Y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; *&lt;/span&gt;&lt;span&gt; np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;exp&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;-&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&lt;/span&gt;&lt;span&gt; Y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplots&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;constrained&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;pcolormesh&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; Y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; Z&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; vmin&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; vmax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; cmap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;RdBu_r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;colorbar&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;pc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;pcolormesh()&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;co&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;contourf&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;X&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; Y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; Z&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; levels&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span&gt;np&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;linspace&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1.25&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1.25&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 11&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;colorbar&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;co&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;contourf()&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;imshow&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;Z&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; cmap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;plasma&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; norm&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;LogNorm&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;vmin&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0.01&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; vmax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;colorbar&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;pc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; extend&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;both&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;imshow() with LogNorm()&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;scatter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;data1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; data2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span&gt;data3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; cmap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;RdBu_r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;colorbar&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;pc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; ax&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; extend&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;both&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);font-style: italic;&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;scatter()&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/colormaps.svg&quot; alt=&quot;colormaps&quot; title=&quot;colormaps&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;
这里分别使用了&lt;code&gt;pcolormesh&lt;/code&gt;、&lt;code&gt;contourf&lt;/code&gt;、&lt;code&gt;imshow&lt;/code&gt;和&lt;code&gt;scatter&lt;/code&gt;四种方法。&lt;/p&gt;
&lt;h2 id=&quot;colormaps&quot;&gt;Colormaps&lt;a class=&quot;zola-anchor&quot; href=&quot;#colormaps&quot; aria-label=&quot;Anchor link for: colormaps&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这些都是&lt;code&gt;ScalarMappable&lt;/code&gt;Artists，都可以将&lt;code&gt;vmin&lt;/code&gt;和&lt;code&gt;vmax&lt;/code&gt;之间的线性映射设置为cmap指定的Colormaps（Colormaps见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/users/explain/colors/colormaps.html&quot;&gt;Choosing Colormaps in Matplotlib&lt;/a&gt;）。&lt;/p&gt;
&lt;h2 id=&quot;normalization&quot;&gt;Normalization&lt;a class=&quot;zola-anchor&quot; href=&quot;#normalization&quot; aria-label=&quot;Anchor link for: normalization&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;有时我们希望数据到颜色图的映射是非线性的，这个时候要提供&lt;code&gt;norm&lt;/code&gt;参数而不是&lt;code&gt;vmin&lt;/code&gt;和&lt;code&gt;vmax&lt;/code&gt;参数（详细见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/users/explain/colors/colormapnorms.html&quot;&gt;Colormap normalization&lt;/a&gt;）。&lt;/p&gt;
&lt;h2 id=&quot;colorbar&quot;&gt;Colorbar&lt;a class=&quot;zola-anchor&quot; href=&quot;#colorbar&quot; aria-label=&quot;Anchor link for: colorbar&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;添加一个Colorbar用于查看颜色与数据的关系，用&lt;code&gt;extend&lt;/code&gt;参数控制Colorbar的外观，用&lt;code&gt;shrink&lt;/code&gt;和&lt;code&gt;aspect&lt;/code&gt;参数控制大小。关于Colorbar的放置位置，见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/users/explain/axes/colorbar_placement.html&quot;&gt;Placing colorbars&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;shi-yong-duo-ge-figureshe-axes&quot;&gt;使用多个Figures和Axes&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-duo-ge-figureshe-axes&quot; aria-label=&quot;Anchor link for: shi-yong-duo-ge-figureshe-axes&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;可以多次调用&lt;code&gt;plt.figure()&lt;/code&gt;或&lt;code&gt;plt.subplots()&lt;/code&gt;来创建多个Figure.&lt;/p&gt;
&lt;p&gt;添加多个&lt;code&gt;Axes&lt;/code&gt;有很多方法，可以用&lt;code&gt;plt.subplots()&lt;/code&gt;，要添加更复杂的可以使用&lt;code&gt;subplot_mosaic&lt;/code&gt;（详细见&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/users/explain/axes/arranging_axes.html&quot;&gt;Arranging multiple Axes in a Figure&lt;/a&gt;和&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://matplotlib.org/stable/users/explain/axes/mosaic.html&quot;&gt;Complex and semantic figure composition (subplot_mosaic)&lt;/a&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fig&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; axd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; plt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;subplot_mosaic&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;upleft&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;                               [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;lowleft&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;constrained&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);font-style: italic;&quot;&gt;upleft&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;upleft&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);font-style: italic;&quot;&gt;lowleft&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;lowleft&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt;axd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);font-style: italic;&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;set_title&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.microrat.com/blog/matplotlib-quickstart/multiple_axes.svg&quot; alt=&quot;multiple_axes&quot; title=&quot;multiple_axes&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; /&gt;&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust性能对比：循环 VS 迭代器</title>
          <pubDate>Fri, 25 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-performance/</link>
          <guid>https://www.microrat.com/blog/rust-performance/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-performance/">&lt;p&gt;为了决定是否使用循环或迭代器，我们需要了解哪个实现更快。&lt;/p&gt;
&lt;p&gt;事实上，迭代器是Rust的&lt;strong&gt;零成本抽象&lt;/strong&gt;（zero-cost abstraction）之一，这意味着，无论我们使用迭代器还是循环，Rust都不会产生任何额外的性能开销。&lt;/p&gt;
&lt;p&gt;请放心使用迭代器和闭包！它们使代码看起来更高级，但并不为此引入运行时性能损失。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust迭代器</title>
          <pubDate>Thu, 24 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-iterator/</link>
          <guid>https://www.microrat.com/blog/rust-iterator/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-iterator/">&lt;p&gt;&lt;strong&gt;迭代器&lt;/strong&gt;（iterator）负责遍历序列中的每一项并确定序列何时结束的逻辑。&lt;/p&gt;
&lt;p&gt;在Rust中迭代器是&lt;strong&gt;惰性的&lt;/strong&gt;（lazy），这意味着它们不会在创建时执行任何操作。考虑以下代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; v1_iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上面的代码中，&lt;code&gt;v1.iter()&lt;/code&gt;创建了一个迭代器，但它并没有执行任何操作。&lt;/p&gt;
&lt;p&gt;下面是的例子中将迭代器和&lt;code&gt;for&lt;/code&gt;循环的使用分开：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; v1_iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    for&lt;/span&gt;&lt;span&gt; val&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span&gt; v1_iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Got: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; val&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一般来说，我们可能会使用一个从0开始的索引变量，使用这个变量索引vector中的值，并循环增加到元素总量。迭代器提供了对多种不同的虚了使用相同逻辑的灵活性，而不只是像vecter这样课索引的数据结构。&lt;/p&gt;
&lt;h1 id=&quot;iteratortraithe-nextfang-fa&quot;&gt;&lt;em&gt;Iterator&lt;/em&gt;trait和&lt;em&gt;next&lt;/em&gt;方法&lt;a class=&quot;zola-anchor&quot; href=&quot;#iteratortraithe-nextfang-fa&quot; aria-label=&quot;Anchor link for: iteratortraithe-nextfang-fa&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;迭代器都实现了一个叫&lt;code&gt;Iterator&lt;/code&gt;的trait，这个trait定义像是这样的：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; trait&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Iterator&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    type&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; next&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Option&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里有一个新语法&lt;code&gt;type Item&lt;/code&gt;和&lt;code&gt;Self::Item&lt;/code&gt;，这是一个关联类型（associated type）。现在只需知道这段代码表明实现了&lt;code&gt;Iterator&lt;/code&gt;trait的类型必须提供一个类型&lt;code&gt;Item&lt;/code&gt;，这个类型是迭代器返回的元素类型。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;next&lt;/code&gt;方法每次返回迭代器中的一个项，封装在&lt;code&gt;Some&lt;/code&gt;中，迭代完成时，返回&lt;code&gt;None&lt;/code&gt;。下面是&lt;code&gt;next&lt;/code&gt;调用的一个例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; iterator_demonstration&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; v1_iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;v1_iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Some&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;v1_iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Some&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;v1_iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Some&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;v1_iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; None&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里要将&lt;code&gt;v1_iter&lt;/code&gt;的类型标注为&lt;code&gt;mut&lt;/code&gt;，因为&lt;code&gt;next&lt;/code&gt;方法需要改变迭代器的内部状态来更总迭代器在序列中的位置。也就是说，代码&lt;strong&gt;消费&lt;/strong&gt;（consume）了，用尽了迭代器。使用&lt;code&gt;for&lt;/code&gt;循环时，无需时&lt;code&gt;v1_iter&lt;/code&gt;标注为&lt;code&gt;mut&lt;/code&gt;，因为&lt;code&gt;for&lt;/code&gt;循环会获取&lt;code&gt;v1_iter&lt;/code&gt;的所有权并在后台使其可变。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;从&lt;code&gt;next&lt;/code&gt;调用中获取的值时对vector中值的不可变引用，&lt;code&gt;iter&lt;/code&gt;方法生成了一个不可变引用的迭代器。如果我们需要一个获取&lt;code&gt;v1&lt;/code&gt;所有权并返回拥有所有权的迭代器，可以使用&lt;code&gt;into_iter&lt;/code&gt;方法，如果希望迭代可变引用，则可以调用&lt;code&gt;iter_mut&lt;/code&gt;方法。&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&quot;xiao-fei-die-dai-qi-de-fang-fa&quot;&gt;消费迭代器的方法&lt;a class=&quot;zola-anchor&quot; href=&quot;#xiao-fei-die-dai-qi-de-fang-fa&quot; aria-label=&quot;Anchor link for: xiao-fei-die-dai-qi-de-fang-fa&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Iterator&lt;/code&gt;trait定义了很多方法，这些方法都可以用于消费迭代器。一些方法在定义中调用了&lt;code&gt;next&lt;/code&gt;方法，这就是为何实现&lt;code&gt;Iterator&lt;/code&gt;trait的类型必须提供&lt;code&gt;next&lt;/code&gt;方法的。&lt;/p&gt;
&lt;p&gt;这些调用&lt;code&gt;next&lt;/code&gt;方法的方法被称为&lt;strong&gt;消费适配器&lt;/strong&gt;（consuming adaptors），因为调用它们会消耗迭代器。一个例子是&lt;code&gt;sum&lt;/code&gt;方法，这个方法会获取迭代器的所有权并反复调用&lt;code&gt;next&lt;/code&gt;方法，因而会消费迭代器。以下是例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; iterator_sum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; v1_iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; total&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; v1_iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 6&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;调用&lt;code&gt;sum&lt;/code&gt;后便不能再使用&lt;code&gt;v1_iter&lt;/code&gt;了。&lt;/p&gt;
&lt;h1 id=&quot;chan-sheng-qi-ta-die-dai-qi-de-fang-fa&quot;&gt;产生其他迭代器的方法&lt;a class=&quot;zola-anchor&quot; href=&quot;#chan-sheng-qi-ta-die-dai-qi-de-fang-fa&quot; aria-label=&quot;Anchor link for: chan-sheng-qi-ta-die-dai-qi-de-fang-fa&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Iterator&lt;/code&gt;trait定义了另一种方法，被称为&lt;strong&gt;迭代器适配器&lt;/strong&gt;（iterator adaptors），这些方法不消耗当前迭代器，而是通过改变原始迭代器的某些方面来生成不同迭代器。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;map&lt;/code&gt;便是一个例子，这个办法获取一个闭包对每个元素进行操作，&lt;code&gt;map&lt;/code&gt;方法返回一个新的迭代器，该迭代器生产经过修改的元素。例子如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不过这个代码会产生警告，因为实际上这个闭包并没有被调用。为了避免警告，我们可以使用&lt;code&gt;collect&lt;/code&gt;方法将迭代器转换为一个集合：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; v2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;collect&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;v2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里用&lt;code&gt;map&lt;/code&gt;方法创建了一个新的迭代器，接着使用&lt;code&gt;collect&lt;/code&gt;方法消费迭代器并创建一个vector。因为所有迭代器都是惰性的，所以必须调用消费迭代器的方法，才能从这些迭代器适配器的调用中获取结果。&lt;/p&gt;
&lt;h1 id=&quot;shi-yong-bu-huo-huan-jing-de-bi-bao&quot;&gt;使用捕获环境的闭包&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-bu-huo-huan-jing-de-bi-bao&quot; aria-label=&quot;Anchor link for: shi-yong-bu-huo-huan-jing-de-bi-bao&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;很多迭代器适配器接受闭包作为参数，而我们通常会指定捕获其环境的闭包作为迭代器适配器参数。&lt;/p&gt;
&lt;p&gt;作为例子，我们使用&lt;code&gt;filter&lt;/code&gt;方法来获取一个闭包。该闭包从迭代器中获取一项并返回一个&lt;code&gt;bool&lt;/code&gt;。如果闭包返回&lt;code&gt;true&lt;/code&gt;，其值将会包含在&lt;code&gt;filter&lt;/code&gt;提供的新迭代器中。如果返回&lt;code&gt;false&lt;/code&gt;，则不会包含在新迭代器中。&lt;/p&gt;
&lt;p&gt;下面是代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;derive&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;PartialEq&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Debug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Shoe&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    style&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; shoes_in_size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;shoes&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Shoe&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; shoe_size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Shoe&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    shoes&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;into_iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;filter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;size &lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;==&lt;/span&gt;&lt;span&gt; shoe_size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;collect&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;cfg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; tests&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; filters_by_size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; shoes&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            Shoe&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; style&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;sneaker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            Shoe&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 13&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; style&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;sandal&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            Shoe&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; style&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;boot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        ]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; in_my_size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; shoes_in_size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;shoes&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            in_my_size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;            vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;                Shoe&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; style&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;sneaker&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;                Shoe&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; size&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; style&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;boot&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;            ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;shoes_in_size&lt;/code&gt;函数体中调用了&lt;code&gt;into_iter&lt;/code&gt;来创建一个获取vector所有权的迭代器，然后用&lt;code&gt;filter&lt;/code&gt;将这个迭代器适配成一个只含有那些闭包返回&lt;code&gt;true&lt;/code&gt;的元素的新迭代器，最后调用&lt;code&gt;collect&lt;/code&gt;方法将这个新迭代器转换为vector。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust闭包</title>
          <pubDate>Wed, 23 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-closures/</link>
          <guid>https://www.microrat.com/blog/rust-closures/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-closures/">&lt;p&gt;Rust的闭包（closures）是一种可以保存在变量或作为参数传递的匿名函数，与函数不同的是，它可以捕获调用者作用域中的值：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; sum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在上面的例子中，&lt;code&gt;sum&lt;/code&gt;变量被赋值为一个闭包，这个闭包捕获了&lt;code&gt;x&lt;/code&gt;变量的值。&lt;/p&gt;
&lt;h1 id=&quot;bi-bao-bu-huo-de-huan-jing&quot;&gt;闭包捕获的环境&lt;a class=&quot;zola-anchor&quot; href=&quot;#bi-bao-bu-huo-de-huan-jing&quot; aria-label=&quot;Anchor link for: bi-bao-bu-huo-de-huan-jing&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;我们通过下面例子来了解这一点。例如，有&lt;code&gt;Red&lt;/code&gt;和&lt;code&gt;Blue&lt;/code&gt;两种成员的&lt;code&gt;ShirtColor&lt;/code&gt;枚举，使用&lt;code&gt;Inventory&lt;/code&gt;结构体来表示库存，&lt;code&gt;Inventory&lt;/code&gt;结构体有一个类型为&lt;code&gt;Vec&amp;lt;ShirtColor&amp;gt;&lt;/code&gt;的字段&lt;code&gt;shirts&lt;/code&gt;，表示库存中的衬衫颜色，并定义&lt;code&gt;giveaway&lt;/code&gt;方法获得免费衬衫得主喜爱的颜色，并返回颜色，代码如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;derive&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; PartialEq&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Copy&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Red&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Inventory&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    shirts&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Inventory&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; giveaway&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; user_preference&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Option&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        user_preference&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;unwrap_or_else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;most_stocked&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; most_stocked&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; num_red&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; num_blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        for&lt;/span&gt;&lt;span&gt; color&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;shirts &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;            match&lt;/span&gt;&lt;span&gt; color&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;                ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Red&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; num_red&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;                ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; num_blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        if&lt;/span&gt;&lt;span&gt; num_red&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; num_blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Red&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Blue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; store&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Inventory&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        shirts&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Red&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; user_pref1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Some&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;ShirtColor&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Red&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; giveaway1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; store&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;giveaway&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;user_pref1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The user with preference &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; gets &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        user_pref1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; giveaway1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    )&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; user_pref2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; None&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; giveaway2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; store&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;giveaway&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;user_pref2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The user with preference &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; gets &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        user_pref2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; giveaway2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    )&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;main&lt;/code&gt;函数里定义&lt;code&gt;store&lt;/code&gt;变量还剩两件蓝衬衫和一件红衬衫，调用&lt;code&gt;giveaway&lt;/code&gt;方法分别传入&lt;code&gt;Some(ShirtColor::Red)&lt;/code&gt;和&lt;code&gt;None&lt;/code&gt;参数，分别表示用户有红衬衫偏好和无衬衫偏好。&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;giveaway&lt;/code&gt;方法中，使用&lt;code&gt;unwrap_or_else&lt;/code&gt;方法来处理用户没有指定衬衫偏好的情况，&lt;code&gt;unwrap_or_else&lt;/code&gt;方法接受一个无参闭包作为参数，该闭包返回&lt;code&gt;ShirtColor&lt;/code&gt;类型的值。如果用户有衬衫偏好，&lt;code&gt;unwrap_or_else&lt;/code&gt;方法会返回用户指定的衬衫颜色，否则会调用&lt;code&gt;most_stocked&lt;/code&gt;方法来返回库存中最受欢迎的颜色。&lt;/p&gt;
&lt;p&gt;将闭包表达式&lt;code&gt;|| self.most_stocked()&lt;/code&gt;作为参数传递给&lt;code&gt;unwrap_or_else&lt;/code&gt;方法，这是一个本身不获取参数的闭包（如果闭包有参数，它们会出现在&lt;code&gt;||&lt;/code&gt;中间）。闭包体调用了&lt;code&gt;self.most_stocked()&lt;/code&gt;方法。这里定义了闭包，而&lt;code&gt;unwrap_or_else&lt;/code&gt;方法会在用户没有指定衬衫偏好时调用闭包。&lt;/p&gt;
&lt;p&gt;我们传递的闭包会在当前&lt;code&gt;Inventory&lt;/code&gt;实例上调用&lt;code&gt;self.most_stocked()&lt;/code&gt;方法，闭包捕获了&lt;code&gt;self&lt;/code&gt;（&lt;code&gt;Inventory&lt;/code&gt;实例）的不可变引用，并将代码传递给&lt;code&gt;unwrap_or_else&lt;/code&gt;方法。&lt;/p&gt;
&lt;h1 id=&quot;bi-bao-lei-xing-tui-duan-he-zhu-jie&quot;&gt;闭包类型推断和注解&lt;a class=&quot;zola-anchor&quot; href=&quot;#bi-bao-lei-xing-tui-duan-he-zhu-jie&quot; aria-label=&quot;Anchor link for: bi-bao-lei-xing-tui-duan-he-zhu-jie&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;闭包一般不要求对参数和返回值进行类型注解，因为函数是暴露给用户的显示接口的一部分，严格定义接口对确保所有人对函数使用和返回值的类型达成一致理解非常重要。而闭包不用于此，它们储存在变量中并被使用。&lt;/p&gt;
&lt;p&gt;闭包通常较短，且与特定的上下文相关，编译器根据上下文推断参数和返回值类型。&lt;/p&gt;
&lt;p&gt;如果添加了类型注解，代码会变得冗长，考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; expensive_closure&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span&gt;num&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;calculating slowly...&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;    thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;sleep&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;Duration&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from_secs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    num&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个语法就更像是函数语法了，下面是闭包与函数语法的纵向对比：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span&gt;  add_one_v1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;   (&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; add_one_v2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; add_one_v3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;             {&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; add_one_v4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt;               x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;  ;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;v3&lt;/code&gt;和&lt;code&gt;v4&lt;/code&gt;需要调用才能编译，因为如果不调用，其类型无法被推断。&lt;/p&gt;
&lt;p&gt;对于闭包，编译器会为每个参数和返回值推断一个具体类型，考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; example_closure&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; example_closure&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hello&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; example_closure&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里在第一次调用闭包是使用了&lt;code&gt;String&lt;/code&gt;类型，编译器会推断&lt;code&gt;x&lt;/code&gt;的类型为&lt;code&gt;String&lt;/code&gt;，这个类型就锁定进闭包&lt;code&gt;example_closure&lt;/code&gt;中，在第二次调用闭包时使用了&lt;code&gt;i32&lt;/code&gt;类型，编译器就会报错。&lt;/p&gt;
&lt;h1 id=&quot;bu-huo-yin-yong-huo-yi-dong-suo-you-quan&quot;&gt;捕获引用或移动所有权&lt;a class=&quot;zola-anchor&quot; href=&quot;#bu-huo-yin-yong-huo-yi-dong-suo-you-quan&quot; aria-label=&quot;Anchor link for: bu-huo-yin-yong-huo-yi-dong-suo-you-quan&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;闭包通过三种方式捕获环境的值，对应三种获取参数的方式：不可变借用、可变借用、获取所有权。考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Before defining closure: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; only_borrows&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;From closure: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Before calling closure: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    only_borrows&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;After calling closure: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里展示一个变量可以绑定一个闭包，我们可以像函数名一样，使用变量名和括号来调用该闭包。&lt;/p&gt;
&lt;p&gt;可以看到在闭包定义之后到调用之后，代码仍然可以访问&lt;code&gt;list&lt;/code&gt;，因为打印只需要不可变引用。&lt;/p&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Before defining closure: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; borrows_mutably&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    borrows_mutably&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;After calling closure: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;在这里闭包定义和调用之间就不能再有`&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;println!&lt;/span&gt;&lt;span&gt;`语句了，因为闭包定义时捕获的`&lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt;`的可变引用，而在闭包调用后就不再使用，可变借用结束，所以可以使用`&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;println!&lt;/span&gt;&lt;span&gt;`语句。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;如果希望闭包将至获得所有权，可以在参数列表前使用`&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;move&lt;/span&gt;&lt;span&gt;`关键字，在将闭包传递到一个新线程时非常有用，考虑下面代码：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;```&lt;/span&gt;&lt;span&gt;rust&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span&gt;thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Before defining closure: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;    thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;spawn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;move&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;From thread: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;        .&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;        .&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们我们生成了一个新线程，并给它传递一个闭包作为参数。这个例子中我们使用了&lt;code&gt;move&lt;/code&gt;关键字来获取&lt;code&gt;list&lt;/code&gt;的所有权，如果不这样做，可能在新线程结束之前&lt;code&gt;list&lt;/code&gt;的不可变引用就会失效。&lt;/p&gt;
&lt;h1 id=&quot;jiang-bei-bu-huo-de-zhi-yi-chu-bi-bao&quot;&gt;将被捕获的值移出闭包&lt;a class=&quot;zola-anchor&quot; href=&quot;#jiang-bei-bu-huo-de-zhi-yi-chu-bi-bao&quot; aria-label=&quot;Anchor link for: jiang-bei-bu-huo-de-zhi-yi-chu-bi-bao&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;闭包捕获和处理环境中的值的方式会影响闭包实现trait，根据闭包体处理这些值的方式，闭包会自动、渐进地实现&lt;code&gt;Fn&lt;/code&gt;trait。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FnOnce&lt;/code&gt;：这个trait适用于只能被调用一次的闭包。所有闭包都至少实现了这个trait，因为所有闭包都能被调用。一个会讲捕获的值移出闭包体的闭包只会实现这个trait而不实现其他&lt;code&gt;Fn&lt;/code&gt;相关的trait。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FnMut&lt;/code&gt;：这个trait适用于不会将捕获的值移出闭包体，但可能会修改捕获值的闭包。这类闭包可以被调用多次。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Fn&lt;/code&gt;：这个trait适用于不会将捕获的值移出闭包体，也不会修改捕获值的闭包。这类闭包在会多次并发调用闭包的场景中十分重要。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面是之前使用的&lt;code&gt;unwarp_or_else&lt;/code&gt;方法的定义：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Option&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; unwrap_or_else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;F&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; F&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    where&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        F&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; FnOnce&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        match&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            Some&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            None&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;unwrap_or_else&lt;/code&gt;方法接受一个闭包作为参数，这个闭包必须能被调用一次，没有参数，返回&lt;code&gt;T&lt;/code&gt;类型的值。trait bound中使用了&lt;code&gt;FnOnce&lt;/code&gt;表示&lt;code&gt;unwrap_or_else&lt;/code&gt;方法最多只会调用闭包一次。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;函数可以实现三种&lt;code&gt;Fn&lt;/code&gt;trait。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;现在我们看定义在slice上的标准库方法&lt;code&gt;sort_by_key&lt;/code&gt;，这个这个方法使用&lt;code&gt;FnMut&lt;/code&gt;trait：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;derive&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rectangle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    width&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    height&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Rectangle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; height&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Rectangle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; height&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Rectangle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; height&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 12&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    ]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;sort_by_key&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt; r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;width&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:#?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;sort_by_key&lt;/code&gt;方法接受一个&lt;code&gt;FnMut&lt;/code&gt;类型的闭包作为参数的原因是它会多次调用这个闭包，而&lt;code&gt;|r| r.width&lt;/code&gt;满足trait要求。&lt;/p&gt;
&lt;p&gt;下面是只实现了&lt;code&gt;FnOnce&lt;/code&gt;trait的闭包的例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;derive&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Rectangle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    width&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    height&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Rectangle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; height&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Rectangle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; height&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Rectangle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; width&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; height&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 12&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    ]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; sort_oprations&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;closure called&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;sort_by_key&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        sort_oprations&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;width&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:#?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里闭包调用&lt;code&gt;push&lt;/code&gt;方法时，&lt;code&gt;value&lt;/code&gt;变量的所有权已经被移动到&lt;code&gt;sort_oprations&lt;/code&gt;中，闭包不能再使用&lt;code&gt;value&lt;/code&gt;变量，这个闭包只实现了&lt;code&gt;FnOnce&lt;/code&gt;trait，所以会报错。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;感觉有点像泛函。&lt;/p&gt;
&lt;/div&gt;
</description>
      </item>
      <item>
          <title>Rast运行测试</title>
          <pubDate>Tue, 22 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-test2/</link>
          <guid>https://www.microrat.com/blog/rust-test2/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-test2/">&lt;p&gt;&lt;code&gt;cargo test&lt;/code&gt;命令会在测试模式下编译代码并运行生成的测试二进制文件，传递参数给&lt;code&gt;cargo test&lt;/code&gt;命令，可以改变测试的行为。一部分参数传递给&lt;code&gt;cargo test&lt;/code&gt;，另一部分传递给测试二进制文件。前面的参数是传递给&lt;code&gt;cargo test&lt;/code&gt;，后面的参数是传递给测试二进制文件。&lt;/p&gt;
&lt;h1 id=&quot;bing-xing-huo-lian-xu-yun-xing-ce-shi&quot;&gt;并行或连续运行测试&lt;a class=&quot;zola-anchor&quot; href=&quot;#bing-xing-huo-lian-xu-yun-xing-ce-shi&quot; aria-label=&quot;Anchor link for: bing-xing-huo-lian-xu-yun-xing-ce-shi&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Rust默认在运行多个测试时会并行运行，但有些时候，例如往一个文件中写入数据，并行运行的测试可能互相干扰导致测试失败，一种解决方法是每一个测试都写不同的文件，另一解决方法是一次运行一个测试。&lt;/p&gt;
&lt;p&gt;想要控制线程数量，可以传递&lt;code&gt;--test-threads&lt;/code&gt;参数，如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;cargo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-test-threads=1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里指定程序不要使用并行机制。&lt;/p&gt;
&lt;h1 id=&quot;xian-shi-han-shu-shu-chu&quot;&gt;显示函数输出&lt;a class=&quot;zola-anchor&quot; href=&quot;#xian-shi-han-shu-shu-chu&quot; aria-label=&quot;Anchor link for: xian-shi-han-shu-shu-chu&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;默认情况下，测试通过时&lt;code&gt;cargo test&lt;/code&gt;不会显示测试函数的输出，想要显示测试函数的输出，可以传递&lt;code&gt;--show-output&lt;/code&gt;参数，如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;cargo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-show-output&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;tong-guo-zhi-ding-ming-zi-lai-yun-xing-bu-fen-ce-shi&quot;&gt;通过指定名字来运行部分测试&lt;a class=&quot;zola-anchor&quot; href=&quot;#tong-guo-zhi-ding-ming-zi-lai-yun-xing-bu-fen-ce-shi&quot; aria-label=&quot;Anchor link for: tong-guo-zhi-ding-ming-zi-lai-yun-xing-bu-fen-ce-shi&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;如果只希望运行相关代码有关的测试，可以通过向&lt;code&gt;cargo test&lt;/code&gt;传递测试函数的名字来运行部分测试，如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;cfg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; tests&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span&gt; add_two_and&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add_three_and_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; one_hundred&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;102&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;yun-xing-dan-ge-ce-shi&quot;&gt;运行单个测试&lt;a class=&quot;zola-anchor&quot; href=&quot;#yun-xing-dan-ge-ce-shi&quot; aria-label=&quot;Anchor link for: yun-xing-dan-ge-ce-shi&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用&lt;code&gt;cargo test one_hundred&lt;/code&gt;只运行&lt;code&gt;one_hundred&lt;/code&gt;这一个测试。&lt;/p&gt;
&lt;h2 id=&quot;yun-xing-duo-ge-ce-shi&quot;&gt;运行多个测试&lt;a class=&quot;zola-anchor&quot; href=&quot;#yun-xing-duo-ge-ce-shi&quot; aria-label=&quot;Anchor link for: yun-xing-duo-ge-ce-shi&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;指定部分名称，则包含这部分名称的测试都会被运行。例如使用&lt;code&gt;cargo test add&lt;/code&gt;会运行&lt;code&gt;add_two_and_two&lt;/code&gt;和&lt;code&gt;add_three_and_two&lt;/code&gt;这两个测试。&lt;/p&gt;
&lt;h2 id=&quot;hu-lue-fei-te-bie-zhi-ding-de-ce-shi&quot;&gt;忽略非特别指定的测试&lt;a class=&quot;zola-anchor&quot; href=&quot;#hu-lue-fei-te-bie-zhi-ding-de-ce-shi&quot; aria-label=&quot;Anchor link for: hu-lue-fei-te-bie-zhi-ding-de-ce-shi&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用&lt;code&gt;ignore&lt;/code&gt;属性可以标记测试的时候排除的测试，如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; right&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span&gt; right&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;cfg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; tests&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; it_works&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;ignore&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; expensive_test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在想要排除的&lt;code&gt;#[test]&lt;/code&gt;之后增加&lt;code&gt;#[ignore]&lt;/code&gt;行，这样使用&lt;code&gt;cargo test&lt;/code&gt;运行测试，就会发现&lt;code&gt;expensive_test&lt;/code&gt;这个测试没有被运行。&lt;/p&gt;
&lt;p&gt;如果我们只希望运行被忽略的测试，可以使用&lt;code&gt;cargo test -- --ignored&lt;/code&gt;命令。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust测试组织结构</title>
          <pubDate>Tue, 22 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-test3/</link>
          <guid>https://www.microrat.com/blog/rust-test3/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-test3/">&lt;p&gt;测试分别为两类，单元测试（unit tests）和集成测试（integration tests）。单元测试倾向于小和集中，集成测试则对于库来说是外部的，只测试公共接口。&lt;/p&gt;
&lt;h1 id=&quot;dan-yuan-ce-shi&quot;&gt;单元测试&lt;a class=&quot;zola-anchor&quot; href=&quot;#dan-yuan-ce-shi&quot; aria-label=&quot;Anchor link for: dan-yuan-ce-shi&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;单元测试的目的是在与其他部分隔离的环境中测试每一个单元的代码，单元测试和要测的代码放在&lt;code&gt;src&lt;/code&gt;下相同的文件中，每个文件中创建包含测试函数的&lt;code&gt;tests&lt;/code&gt;模块，并使用&lt;code&gt;cfg(test)&lt;/code&gt;标注模块。&lt;/p&gt;
&lt;h2 id=&quot;ce-shi-mo-kuai-he-cfg-test&quot;&gt;测试模块和#[cfg(test)]&lt;a class=&quot;zola-anchor&quot; href=&quot;#ce-shi-mo-kuai-he-cfg-test&quot; aria-label=&quot;Anchor link for: ce-shi-mo-kuai-he-cfg-test&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;#[cfg(test)]&lt;/code&gt;告诉Rust在执行&lt;code&gt;cargo test&lt;/code&gt;命令时才编译和运行测试代码，而在执行&lt;code&gt;cargo build&lt;/code&gt;命令时则不编译测试代码。而集成测试由于在另外的文件夹，所以不需要&lt;code&gt;#[cfg(test)]&lt;/code&gt;标注。&lt;/p&gt;
&lt;h2 id=&quot;ce-shi-si-you-han-shu&quot;&gt;测试私有函数&lt;a class=&quot;zola-anchor&quot; href=&quot;#ce-shi-si-you-han-shu&quot; aria-label=&quot;Anchor link for: ce-shi-si-you-han-shu&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Rust的私有性规则允许你测试私有函数，考虑下面的例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    internal_adder&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; internal_adder&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; right&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span&gt; right&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;cfg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; tests&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; internal&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; internal_adder&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里&lt;code&gt;internal_adder&lt;/code&gt;函数是私有的，但是在&lt;code&gt;tests&lt;/code&gt;模块中可以测试它。&lt;/p&gt;
&lt;h1 id=&quot;ji-cheng-ce-shi&quot;&gt;集成测试&lt;a class=&quot;zola-anchor&quot; href=&quot;#ji-cheng-ce-shi&quot; aria-label=&quot;Anchor link for: ji-cheng-ce-shi&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;集成测试完全是外部的，所以只能调用公有API，为了创建集成测试，需要先创建一个&lt;code&gt;tests&lt;/code&gt;目录。&lt;/p&gt;
&lt;h2 id=&quot;testsmu-lu&quot;&gt;&lt;em&gt;tests&lt;/em&gt;目录&lt;a class=&quot;zola-anchor&quot; href=&quot;#testsmu-lu&quot; aria-label=&quot;Anchor link for: testsmu-lu&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;编写集成测试要在项目根目录创建一个&lt;code&gt;tests&lt;/code&gt;目录，Cargo会将&lt;code&gt;tests&lt;/code&gt;目录下的所有文件都当作独立的crate来编译。&lt;/p&gt;
&lt;p&gt;创建&lt;code&gt;tests/integration_test.rs&lt;/code&gt;文件，在其中编写集成测试：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; adder&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span&gt;add_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; it_adds_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不需要在代码中标注&lt;code&gt;#[cfg(test)]&lt;/code&gt;，因为&lt;code&gt;tests&lt;/code&gt;目录下的所有文件只有在运行&lt;code&gt;cargo test&lt;/code&gt;命令时才会被编译。可以使用&lt;code&gt;cargo test --test integration_test&lt;/code&gt;来运行&lt;code&gt;integration_test.rs&lt;/code&gt;文件中的测试。&lt;/p&gt;
&lt;h2 id=&quot;ji-cheng-ce-shi-zhong-de-zi-mo-kuai&quot;&gt;集成测试中的子模块&lt;a class=&quot;zola-anchor&quot; href=&quot;#ji-cheng-ce-shi-zhong-de-zi-mo-kuai&quot; aria-label=&quot;Anchor link for: ji-cheng-ce-shi-zhong-de-zi-mo-kuai&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;由于&lt;code&gt;tests&lt;/code&gt;目录下的所有文件都是独立的crate，所以&lt;code&gt;tests&lt;/code&gt;下文件的行为与&lt;code&gt;src&lt;/code&gt;中的不一样。&lt;/p&gt;
&lt;p&gt;当有一些在多个集成测试文件都会用到的帮助函数，可以把它们都提取到一个通用的模块中，例如可以创建一个&lt;code&gt;tests/common.rs&lt;/code&gt;文件，并创建一个叫&lt;code&gt;setup&lt;/code&gt;的函数，如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; setup&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;    //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; code to run before each test&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个时候运行&lt;code&gt;cargo test&lt;/code&gt;，&lt;code&gt;common&lt;/code&gt;会出现在测试结果中。&lt;/p&gt;
&lt;p&gt;为了不让&lt;code&gt;common&lt;/code&gt;会出现在测试结果中，我们将创建&lt;code&gt;tests/common/mod.rs&lt;/code&gt;而不是创建&lt;code&gt;tests/common.rs&lt;/code&gt;，这样告诉Rust不要将&lt;code&gt;common&lt;/code&gt;当作一个集成测试文件。而这样也可以在其他的集成测试文件中调用这个模块：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; adder&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span&gt;add_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; common&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; it_adds_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;    common&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;setup&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add_two&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;er-jin-zhi-cratede-ji-cheng-ce-shi&quot;&gt;二进制crate的集成测试&lt;a class=&quot;zola-anchor&quot; href=&quot;#er-jin-zhi-cratede-ji-cheng-ce-shi&quot; aria-label=&quot;Anchor link for: er-jin-zhi-cratede-ji-cheng-ce-shi&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果项目是一个二进制crate，只包含一个&lt;code&gt;src/main.rs&lt;/code&gt;文件而没有&lt;code&gt;src/lib.rs&lt;/code&gt;文件，那么&lt;code&gt;tests&lt;/code&gt;目录创建的集成测试就不能导入&lt;code&gt;src/main.rs&lt;/code&gt;中的函数，所以许多二进制项目会使用一个简单的&lt;code&gt;src/main.rs&lt;/code&gt;文件来调用&lt;code&gt;src/lib.rs&lt;/code&gt;中的函数。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rast编写自动化测试</title>
          <pubDate>Mon, 21 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-test1/</link>
          <guid>https://www.microrat.com/blog/rust-test1/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-test1/">&lt;p&gt;Rust中的测试函数是用来验证非测试代码是否按照期望方式运行的。一般执行以下三种操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;设置任何所需的数据或状态&lt;/li&gt;
&lt;li&gt;运行所需要测试的代码&lt;/li&gt;
&lt;li&gt;断言其结果是我们所期望的&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;ce-shi-han-shu-pou-xi&quot;&gt;测试函数剖析&lt;a class=&quot;zola-anchor&quot; href=&quot;#ce-shi-han-shu-pou-xi&quot; aria-label=&quot;Anchor link for: ce-shi-han-shu-pou-xi&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;新建一个库项目，它的&lt;em&gt;src/lib.rs&lt;/em&gt;内容如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; right&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span&gt; right&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;cfg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; tests&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; it_works&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们关注&lt;code&gt;it_works&lt;/code&gt;函数，&lt;code&gt;fn&lt;/code&gt;行之前的&lt;code&gt;#[test]&lt;/code&gt;表明这是一个测试函数。这里使用&lt;code&gt;assert_eq!&lt;/code&gt;宏来断言&lt;code&gt;result&lt;/code&gt;的值等于4。&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;cargo test&lt;/code&gt;命令来运行测试，结果如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;running 1 test&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;test tests::it_works ... ok&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   Doc-tests testdd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;running 0 tests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以看见我们通过了测试。&lt;/p&gt;
&lt;p&gt;下面我们添加一个测试失败的例子，当测试函数出现panic时测试就失败了。&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; right&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; u64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span&gt; right&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;cfg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; tests&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; exploration&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        assert_eq!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; another&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        panic!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Make this test fail&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再次运行&lt;code&gt;cargo test&lt;/code&gt;，结果如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;running 2 tests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;test tests::it_works ... ok&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;test tests::another ... FAILED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;failures:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---- tests::another stdout ----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;thread &amp;#39;tests::another&amp;#39; panicked at src/lib.rs:17:9:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Make this test fail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;failures:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tests::another&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;error: test failed, to rerun pass `--lib`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里可以看见一个测试通过，一个测试失败。&lt;/p&gt;
&lt;h1 id=&quot;shi-yong-hong-lai-jian-cha-jie-guo&quot;&gt;使用宏来检查结果&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-hong-lai-jian-cha-jie-guo&quot; aria-label=&quot;Anchor link for: shi-yong-hong-lai-jian-cha-jie-guo&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;assert!&lt;/code&gt;由标准库提供，需要向&lt;code&gt;assert!&lt;/code&gt;提供一个布尔值的参数。如果时间为&lt;code&gt;true&lt;/code&gt;，就什么都不会做，如果是&lt;code&gt;false&lt;/code&gt;，就会调用&lt;code&gt;panic!&lt;/code&gt;宏。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;assert_eq!&lt;/code&gt;和&lt;code&gt;assert_ne!&lt;/code&gt;宏会比较两个值是否相等，两个宏都有两个参数，如果两个参数相等时，&lt;code&gt;assert_eq!&lt;/code&gt;什么都不会做，&lt;code&gt;assert_ne!&lt;/code&gt;会调用&lt;code&gt;panic!&lt;/code&gt;宏，如果两个参数不相等时，&lt;code&gt;assert_eq!&lt;/code&gt;会调用&lt;code&gt;panic!&lt;/code&gt;宏，&lt;code&gt;assert_ne!&lt;/code&gt;什么都不会做。&lt;br&gt;
由于&lt;code&gt;assert_eq!&lt;/code&gt;和&lt;code&gt;assert_ne!&lt;/code&gt;宏底层分别使用了&lt;code&gt;==&lt;/code&gt;和&lt;code&gt;!=&lt;/code&gt;操作符，所以被比较的值必须实现了&lt;code&gt;PartialEq&lt;/code&gt;和&lt;code&gt;Debug&lt;/code&gt;这两个trait。&lt;/p&gt;
&lt;p&gt;可以向&lt;code&gt;assert!&lt;/code&gt;、&lt;code&gt;assert_eq!&lt;/code&gt;和&lt;code&gt;assert_ne!&lt;/code&gt;提供一个可选的失败信息参数，可以在测试失败时将自定义失败信息打印出来。在这三个函数必要的参数后面添加的参数都会传递给&lt;code&gt;format!&lt;/code&gt;宏。&lt;/p&gt;
&lt;h1 id=&quot;shi-yong-should-panicjian-cha-panic&quot;&gt;使用&lt;em&gt;should_panic&lt;/em&gt;检查panic&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-should-panicjian-cha-panic&quot; aria-label=&quot;Anchor link for: shi-yong-should-panicjian-cha-panic&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;对函数增加另一个属性&lt;code&gt;should_panic&lt;/code&gt;使这个函数在panic时通过，在没有panic时失败：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Guess&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Guess&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Guess&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        if&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;|&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;            panic!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Guess value must be between 1 and 100, got &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Guess&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;cfg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; tests&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;should_panic&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; greater_than_100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Guess&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;#[should_panic]&lt;/code&gt;属性位于&lt;code&gt;#[test]&lt;/code&gt;属性的下面之后。&lt;/p&gt;
&lt;p&gt;然而，&lt;code&gt;should_panic&lt;/code&gt;测试结果也可能含糊不清，在一些不是我们期望的原因而导致的panic时，测试也会通过。为了让测试更清晰，我们可以增加&lt;code&gt;expected&lt;/code&gt;参数：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Guess&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Guess&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Guess&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        if&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;  {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;            panic!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Guess value must be greater than or equal to 1, got &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; if&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;            panic!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Guess value must be less than or equal to 100, got &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Guess&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;cfg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; tests&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;should_panic&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;expected &lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;less than or equal to 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; greater_than_100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Guess&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;200&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个测试会通过，因为panic信息包含了&lt;code&gt;less than or equal to 100&lt;/code&gt;。&lt;/p&gt;
&lt;h1 id=&quot;jiang-result-t-e-yong-yu-ce-shi&quot;&gt;将*Result&amp;lt;T,E&amp;gt;*用于测试&lt;a class=&quot;zola-anchor&quot; href=&quot;#jiang-result-t-e-yong-yu-ce-shi&quot; aria-label=&quot;Anchor link for: jiang-result-t-e-yong-yu-ce-shi&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;我们可以用&lt;code&gt;Result&amp;lt;T,E&amp;gt;&lt;/code&gt;编写测试，这样在失败时可以返回&lt;code&gt;Err&lt;/code&gt;而不是panic：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; right&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; usize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    left&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span&gt; right&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;cfg&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; tests&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; super&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    #&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; it_works&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        if&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            Err&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;two plus two does not equal four&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个函数体中没有调用&lt;code&gt;assert_eq!&lt;/code&gt;宏，而是直接返回一个&lt;code&gt;Result&amp;lt;T,E&amp;gt;&lt;/code&gt;。如果测试通过，就返回&lt;code&gt;Ok(())&lt;/code&gt;，如果测试失败，就返回&lt;code&gt;Err&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;不能对&lt;code&gt;Result&amp;lt;T,E&amp;gt;&lt;/code&gt;使用&lt;code&gt;#[should_panic]&lt;/code&gt;注解，应该使用&lt;code&gt;assert!&lt;/code&gt;宏，像这样：&lt;code&gt;assert!(value.is_err())&lt;/code&gt;。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust生命周期</title>
          <pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-lifetime/</link>
          <guid>https://www.microrat.com/blog/rust-lifetime/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-lifetime/">&lt;p&gt;生命周期是另一类泛型，不是确保类型有期望的行为，而是确保引用如预期一直有效。大多数时候，生命周期是隐式的，Rust会根据引用的使用方式来推断生命周期，但是一些时候引用的生命周期以一些不同方式相关联，Rust需要我们使用泛型生命周期参数来注明它们的关系。&lt;/p&gt;
&lt;h1 id=&quot;sheng-ming-zhou-qi-bi-mian-liao-xuan-chui-yin-yong&quot;&gt;生命周期避免了悬垂引用&lt;a class=&quot;zola-anchor&quot; href=&quot;#sheng-ming-zhou-qi-bi-mian-liao-xuan-chui-yin-yong&quot; aria-label=&quot;Anchor link for: sheng-ming-zhou-qi-bi-mian-liao-xuan-chui-yin-yong&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑下面的代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;r: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码会报错，因为在&lt;code&gt;{}&lt;/code&gt;中，&lt;code&gt;x&lt;/code&gt;的生命周期结束了，但是&lt;code&gt;r&lt;/code&gt;仍然指向&lt;code&gt;x&lt;/code&gt;，这就是悬垂引用。&lt;/p&gt;
&lt;h1 id=&quot;jie-yong-jian-cha-qi&quot;&gt;借用检查器&lt;a class=&quot;zola-anchor&quot; href=&quot;#jie-yong-jian-cha-qi&quot; aria-label=&quot;Anchor link for: jie-yong-jian-cha-qi&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Rust有一个&lt;strong&gt;借用检查器&lt;/strong&gt;（&lt;em&gt;borrow checker&lt;/em&gt;），他比较作用域来确保所有借用都是有效的，下面是上面代码带有生命周期的注释：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;                    //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; ---------+-- &amp;#39;a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;                              //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;                         //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;            //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; -+-- &amp;#39;b  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;               //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;  |       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;                         //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; -+       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;r: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;     //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;          |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;                             //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; ---------+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&#39;a&lt;/code&gt;是&lt;code&gt;r&lt;/code&gt;的生命周期，&lt;code&gt;&#39;b&lt;/code&gt;是&lt;code&gt;x&lt;/code&gt;的生命周期，编译时，Rust会比较两个生命周期的大小，并发现&lt;code&gt;r&lt;/code&gt;拥有生命周期&lt;code&gt;&#39;a&lt;/code&gt;，不过它引用了一个拥有生命周期&lt;code&gt;&#39;b&lt;/code&gt;的变量，这是不允许的，因为被引用的对象比他的引用者存在时间更短。下面是没有悬垂引用的代码例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;                //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; ----------+-- &amp;#39;b&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;                              //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;           |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;               //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; --+-- &amp;#39;a  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;                              //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;   |       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;r: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; r&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;     //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;   |       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;                              //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; --+       |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;                             //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; ----------+&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;&#39;a&lt;/code&gt;的生命周期比&lt;code&gt;&#39;b&lt;/code&gt;的生命周期长，所以这是合法的。&lt;/p&gt;
&lt;h1 id=&quot;han-shu-zhong-de-fan-xing-sheng-ming-zhou-qi&quot;&gt;函数中的泛型生命周期&lt;a class=&quot;zola-anchor&quot; href=&quot;#han-shu-zhong-de-fan-xing-sheng-ming-zhou-qi&quot; aria-label=&quot;Anchor link for: han-shu-zhong-de-fan-xing-sheng-ming-zhou-qi&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;编写一个返回两个字符串slice中长的那个的函数：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; longest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    if&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        y&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码不能编译，因为Rust不知道将要返回的引用是来自&lt;code&gt;x&lt;/code&gt;还是&lt;code&gt;y&lt;/code&gt;。编译器不知道返回的生命周期是怎么和&lt;code&gt;x&lt;/code&gt;和&lt;code&gt;y&lt;/code&gt;相关联的，所以它会报错。&lt;/p&gt;
&lt;p&gt;为了解决这个问题，我们需要使用泛型生命周期参数。&lt;/p&gt;
&lt;h2 id=&quot;sheng-ming-zhou-qi-zhu-jie-yu-fa&quot;&gt;生命周期注解语法&lt;a class=&quot;zola-anchor&quot; href=&quot;#sheng-ming-zhou-qi-zhu-jie-yu-fa&quot; aria-label=&quot;Anchor link for: sheng-ming-zhou-qi-zhu-jie-yu-fa&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;生命周期注解不改变任何引用的生命周期长短，只是描述多个引用生命周期相互的关系。指定了泛型生命周期后函数也能接受任何生命周期的引用。&lt;/p&gt;
&lt;p&gt;生命周期注解参数名称必须以（&lt;code&gt;&#39;&lt;/code&gt;）开头，名称通常全为小写，且很短。生命周期参数注解位于引用&lt;code&gt;&amp;amp;&lt;/code&gt;之后，并有一个空格来将引用类型和生命周期注解分隔开。下面是一些例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;          //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 引用&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;       //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 带有显式生命周期的引用&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;   //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; 带有显式生命周期的可变引用&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;单个生命周期注解本身没什么意义，因为生命周期注解是告诉Rust多个引用的泛型生命周期参数的联系的。&lt;/p&gt;
&lt;h2 id=&quot;han-shu-qian-ming-zhong-de-sheng-ming-zhou-qi-zhu-jie&quot;&gt;函数签名中的生命周期注解&lt;a class=&quot;zola-anchor&quot; href=&quot;#han-shu-qian-ming-zhong-de-sheng-ming-zhou-qi-zhu-jie&quot; aria-label=&quot;Anchor link for: han-shu-qian-ming-zhong-de-sheng-ming-zhou-qi-zhu-jie&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在函数签名中使用生命周期注解需要在函数名和参数列表间的尖括号中声明泛型生命周期参数，假如希望两个参数和返回的引用存活得一样久，则代码如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; longest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    if&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        y&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里表示函数返回的引用的生命周期和函数参数所引用的值的生命周期的较小值一致。&lt;/p&gt;
&lt;p&gt;具体引用被传递给&lt;code&gt;longest&lt;/code&gt;时，被&lt;code&gt;&#39;a&lt;/code&gt;所替代的具体生命周期是&lt;code&gt;x&lt;/code&gt;和&lt;code&gt;y&lt;/code&gt;的作用域重叠的那一部分。返回的引用值能保证在&lt;code&gt;x&lt;/code&gt;和&lt;code&gt;y&lt;/code&gt;的作用域内有效。查看下面例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; string1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;long string is long&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; string2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;xyz&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; longest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;string1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;as_str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; string2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;as_str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The longest string is &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里&lt;code&gt;string1&lt;/code&gt;和&lt;code&gt;string2&lt;/code&gt;的在内部作用域都有效，所以&lt;code&gt;result&lt;/code&gt;也有效。下面看另外的例子。&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; string1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;long string is long&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        let&lt;/span&gt;&lt;span&gt; string2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;xyz&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; longest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;string1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;as_str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; string2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;as_str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The longest string is &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在外部作用域中，&lt;code&gt;string1&lt;/code&gt;是有效的，但是&lt;code&gt;string2&lt;/code&gt;是无效的，为了保证&lt;code&gt;println!&lt;/code&gt;中的&lt;code&gt;result&lt;/code&gt;是有效的，&lt;code&gt;string2&lt;/code&gt;也需要在外部作用域有效，所以代码无法编译。&lt;/p&gt;
&lt;p&gt;虽然以代码的角度讲，上述例子&lt;code&gt;println!&lt;/code&gt;中的&lt;code&gt;result&lt;/code&gt;中是&lt;code&gt;string1&lt;/code&gt;的引用，但是生命周期参数告诉Rust，&lt;code&gt;result&lt;/code&gt;的生命周期不能超过&lt;code&gt;string2&lt;/code&gt;的生命周期。&lt;/p&gt;
&lt;p&gt;考虑如下代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; longest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里为&lt;code&gt;x&lt;/code&gt;和返回值指定了生命周期参数&lt;code&gt;&#39;a&lt;/code&gt;，但是没有为&lt;code&gt;y&lt;/code&gt;指定生命周期，因&lt;code&gt;y&lt;/code&gt;的生命周期与&lt;code&gt;x&lt;/code&gt;和返回值生命周期无关。&lt;/p&gt;
&lt;p&gt;函数返回一个引用，返回值的生命周期参数需要与一个参数的生命周期参数相匹配。如果其返回的引用没有指向任何一个参数，那么唯一的可能就是它指向一个函数内部创建的值，这是一个悬垂引用，因为函数结束时就离开了作用域，不能编译：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; longest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;really long string&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;as_str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;result&lt;/code&gt;在函数结尾就被清理，返回的是一个悬垂引用。&lt;/p&gt;
&lt;h1 id=&quot;jie-gou-ti-zhong-ding-yi-de-sheng-ming-zhou-qi-zhu-jie&quot;&gt;结构体中定义的生命周期注解&lt;a class=&quot;zola-anchor&quot; href=&quot;#jie-gou-ti-zhong-ding-yi-de-sheng-ming-zhou-qi-zhu-jie&quot; aria-label=&quot;Anchor link for: jie-gou-ti-zhong-ding-yi-de-sheng-ming-zhou-qi-zhu-jie&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;在定义包含引用的结构体中，需要为结构体定义的每个引用指定生命周期：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; ImportantExcerpt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    part&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; novel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Call me Ishmael. Some years ago...&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; first_sentence&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; novel&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; ImportantExcerpt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        part&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span&gt; first_sentence&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个结构体有唯一字段&lt;code&gt;part&lt;/code&gt;，它存放了字符串slice，是一个引用，必须在结构一名称后面的尖括号中声明泛型生命周期参数。这个注解意味着&lt;code&gt;ImportantExcerpt&lt;/code&gt;实例的生命周期不能比&lt;code&gt;part&lt;/code&gt;引用的生命周期久。&lt;/p&gt;
&lt;h1 id=&quot;sheng-ming-zhou-qi-sheng-lue-lifetime-elision&quot;&gt;生命周期省略（Lifetime Elision）&lt;a class=&quot;zola-anchor&quot; href=&quot;#sheng-ming-zhou-qi-sheng-lue-lifetime-elision&quot; aria-label=&quot;Anchor link for: sheng-ming-zhou-qi-sheng-lue-lifetime-elision&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;每一个引用都有一个生命周期，然而考虑以下代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; first_word&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; bytes&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;as_bytes&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; (&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span&gt; bytes&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;iter&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;enumerate&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        if&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;            return&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;..&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;    &amp;amp;&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码的参数和返回值都是引用，虽然没有使用生命周期注解，但是可以编译，因为Rust有一个&lt;strong&gt;生命周期省略规则&lt;/strong&gt;（&lt;em&gt;lifetime elision rule&lt;/em&gt;）。
编译器通过三条规则来判断引用何时不需要明确的注解，第一条适用于输入生命周期，后面两条适用于输出生命周期：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;编译器为每一个引用参数都分配了一个生命周期参数。&lt;/li&gt;
&lt;li&gt;如果只有一个输入生命周期参数，那么它被赋予所有输出生命周期参数。&lt;/li&gt;
&lt;li&gt;如果方法有多个输入生命周期参数，且其中一个是&lt;code&gt;&amp;amp;self&lt;/code&gt;或&lt;code&gt;&amp;amp;mut self&lt;/code&gt;，那么&lt;code&gt;self&lt;/code&gt;的生命周期被赋予所有输出生命周期参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下是例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; first_word&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里适用第一条规则，所以是下面这样：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; first_word&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后适用第二条规则：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; first_word&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在编译器就可以编译了。&lt;/p&gt;
&lt;p&gt;再看看另一个例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; longest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里适用第一条规则，所以是下面这样：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; longest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后第二条规则和第三条规则都适用，所以会出错。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;实际上第三条规则真正能够适用的只有方法签名。&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&quot;fang-fa-qian-ming-zhong-de-sheng-ming-zhou-qi-zhu-jie&quot;&gt;方法签名中的生命周期注解&lt;a class=&quot;zola-anchor&quot; href=&quot;#fang-fa-qian-ming-zhong-de-sheng-ming-zhou-qi-zhu-jie&quot; aria-label=&quot;Anchor link for: fang-fa-qian-ming-zhong-de-sheng-ming-zhou-qi-zhu-jie&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;带生命周期的结构体实现方法时，我们在哪里声明和使用生命周期参数取决于它们是与结构体字段相关还是与方法参数和返回值相关。&lt;/p&gt;
&lt;p&gt;实现方法时结构体字段的生命周期必须总是在&lt;code&gt;impl&lt;/code&gt;关键字之后声明并在结构体名称之后被使用，下面看例子：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; ImportantExcerpt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    part&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; ImportantExcerpt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; level&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;        3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里方法&lt;code&gt;level&lt;/code&gt;唯一的参数是&lt;code&gt;self&lt;/code&gt;的引用，返回值是&lt;code&gt;i32&lt;/code&gt;，&lt;code&gt;impl&lt;/code&gt;和类型名后面的生命周期参数是必要的，不过因为第一条生命周期规则我们不用标注&lt;code&gt;self&lt;/code&gt;引用的生命周期。&lt;/p&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; ImportantExcerpt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; announce_and_return_part&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; announcement&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Attention please: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; announcement&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;        self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;part&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里应用第一条规则和第三条规则，所有引用的生命周期都被计算出来了。&lt;/p&gt;
&lt;h1 id=&quot;jing-tai-sheng-ming-zhou-qi&quot;&gt;静态生命周期&lt;a class=&quot;zola-anchor&quot; href=&quot;#jing-tai-sheng-ming-zhou-qi&quot; aria-label=&quot;Anchor link for: jing-tai-sheng-ming-zhou-qi&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;一种特殊的生命周期&lt;code&gt;&#39;static&lt;/code&gt;，它表示引用的生命周期与整个程序的运行时间相同。将引用指定为&lt;code&gt;&#39;static&lt;/code&gt;要考虑这个引用是否真的需要在整个程序生命周期都有效，而不是只是为了修复一些悬垂引用或可用生命周期不匹配的错误。&lt;/p&gt;
&lt;h1 id=&quot;jie-he-fan-xing-lei-xing-can-shu-trait-boundhe-sheng-ming-zhou-qi&quot;&gt;结合泛型类型参数、trait bound和生命周期&lt;a class=&quot;zola-anchor&quot; href=&quot;#jie-he-fan-xing-lei-xing-can-shu-trait-boundhe-sheng-ming-zhou-qi&quot; aria-label=&quot;Anchor link for: jie-he-fan-xing-lei-xing-can-shu-trait-boundhe-sheng-ming-zhou-qi&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑以下代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;fmt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Display&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; longest_with_an_announcement&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;    x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;    y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;    ann&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; str&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;where&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Display&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Announcement! &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; ann&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    if&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        y&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个例子同时使用了生命周期注解、泛型类型参数和trait bound。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust的Trait（定义共同行为）</title>
          <pubDate>Sat, 19 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-trait/</link>
          <guid>https://www.microrat.com/blog/rust-trait/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-trait/">&lt;p&gt;&lt;code&gt;trait&lt;/code&gt;定义了某个类型可能与其他类型共享的功能，用抽象的方式定义共同行为。&lt;/p&gt;
&lt;h1 id=&quot;ding-yi-trait&quot;&gt;定义trait&lt;a class=&quot;zola-anchor&quot; href=&quot;#ding-yi-trait&quot; aria-label=&quot;Anchor link for: ding-yi-trait&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;trait定义是一种将方法签名组合起来的方法，目的是定义一个实现某些目的所必需的行为的合集。&lt;/p&gt;
&lt;p&gt;例如，这里有存放了不同类型和属性文本的结构体&lt;code&gt;NewsArticle&lt;/code&gt;和&lt;code&gt;Tweet&lt;/code&gt;，我们想创建一个&lt;code&gt;aggregator&lt;/code&gt;的库用来显示&lt;code&gt;NewsArticle&lt;/code&gt;和&lt;code&gt;Tweet&lt;/code&gt;的数据摘要，就可以调用&lt;code&gt;summarize&lt;/code&gt;方法来请求摘要：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; trait&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; summarize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用&lt;code&gt;trait&lt;/code&gt;关键字来声明一个trait，在大括号里声明实现这个trait的类型所需要的行为的方法签名。&lt;/p&gt;
&lt;p&gt;每一个实现这个trait的类型需要提供自定义的方法体。&lt;/p&gt;
&lt;h1 id=&quot;wei-lei-xing-shi-xian-trait&quot;&gt;为类型实现trait&lt;a class=&quot;zola-anchor&quot; href=&quot;#wei-lei-xing-shi-xian-trait&quot; aria-label=&quot;Anchor link for: wei-lei-xing-shi-xian-trait&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑以下代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; NewArticle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span&gt; headline&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span&gt; location&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span&gt; author&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; NewsArticle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; summarize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        format!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;, by &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;headline&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Tweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span&gt; username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span&gt; reply&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; bool&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span&gt; retweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; bool&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Tweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; summarize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;        format!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可见trait的实现是在&lt;code&gt;impl&lt;/code&gt;关键字后面跟trait名，然后是&lt;code&gt;for&lt;/code&gt;关键字，最后是类型名。现在&lt;code&gt;NewsArticle&lt;/code&gt;和&lt;code&gt;Tweet&lt;/code&gt;都实现了&lt;code&gt;Summary&lt;/code&gt;trait，我们可以像调用常规方法一样调用&lt;code&gt;summarize&lt;/code&gt;方法，区别在于trait需要和类型一起引入作用域：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; aggregator&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Tweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; tweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Tweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;horse_ebooks&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        content&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;of course, as you probably already know, people&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        reply&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        retweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;1 new tweet: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; tweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;summarize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;这里需要注意的是，只有类型或trait至少有一个属于当前crate时，我们才能对类型实现trait。这个限制是被称作相关性（coherence）的程序属性的一部分，或者更具体说是孤儿规则（orphan rule）。这个规则确保其他人编写的代码不会破坏你的代码。&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&quot;mo-ren-shi-xian&quot;&gt;默认实现&lt;a class=&quot;zola-anchor&quot; href=&quot;#mo-ren-shi-xian&quot; aria-label=&quot;Anchor link for: mo-ren-shi-xian&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;为trait中的某些方法提供默认行为而不是每个类型每个实现都定义自己的行为很有用，当某个特定类型实现trait时，可以选择保留或重载每个方法的默认行为。&lt;/p&gt;
&lt;p&gt;考虑如下代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; trait&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; summarize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;(Read more...)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想对&lt;code&gt;NewsArticle&lt;/code&gt;使用这个默认实现，可以通过&lt;code&gt;impl Summary for NewsArticle {}&lt;/code&gt;指定一个空的&lt;code&gt;impl&lt;/code&gt;块。这个时候调用&lt;code&gt;NewsArticle&lt;/code&gt;的&lt;code&gt;summarize&lt;/code&gt;方法就会返回默认实现的结果。&lt;/p&gt;
&lt;p&gt;默认实现允许调用相同trait中的其他方法，只需调用的方法定义了就行。&lt;/p&gt;
&lt;h1 id=&quot;traitzuo-wei-can-shu&quot;&gt;trait作为参数&lt;a class=&quot;zola-anchor&quot; href=&quot;#traitzuo-wei-can-shu&quot; aria-label=&quot;Anchor link for: traitzuo-wei-can-shu&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; notify&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Breaking news! &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;summarize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于&lt;code&gt;item&lt;/code&gt;参数，我们指定了&lt;code&gt;impl Summary&lt;/code&gt;而不是具体类型，这个参数支持任何实现了&lt;code&gt;Summary&lt;/code&gt;trait的类型。在&lt;code&gt;notify&lt;/code&gt;函数中，我们可以调用任何来自&lt;code&gt;Summary&lt;/code&gt;的方法。&lt;/p&gt;
&lt;h1 id=&quot;trait-boundyu-fa&quot;&gt;trait bound语法&lt;a class=&quot;zola-anchor&quot; href=&quot;#trait-boundyu-fa&quot; aria-label=&quot;Anchor link for: trait-boundyu-fa&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;impl Trait&lt;/code&gt;语法实际上是&lt;em&gt;trait bound&lt;/em&gt;语法的语法糖：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; notify&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Breaking news! &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;summarize&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;impl Trait&lt;/code&gt;用于短小的例子，而trait bound用于更复杂的情况，若是参数为两个实现了&lt;code&gt;Summary&lt;/code&gt;trait的类型，我们可以这样写：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; notify&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;item1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; item2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中&lt;code&gt;item1&lt;/code&gt;和&lt;code&gt;item2&lt;/code&gt;的类型可以不同，如果需要它们都是相同类型，则需要这样写：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; notify&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;item1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; item2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里&lt;code&gt;item1&lt;/code&gt;和&lt;code&gt;item2&lt;/code&gt;的类型都为&lt;code&gt;T&lt;/code&gt;，所以类型必须相同。&lt;/p&gt;
&lt;h1 id=&quot;zhi-ding-duo-ge-trait-bound&quot;&gt;指定多个trait bound&lt;a class=&quot;zola-anchor&quot; href=&quot;#zhi-ding-duo-ge-trait-bound&quot; aria-label=&quot;Anchor link for: zhi-ding-duo-ge-trait-bound&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;如果&lt;code&gt;notify&lt;/code&gt;函数需要显示&lt;code&gt;itme&lt;/code&gt;的格式化形式，也要使用&lt;code&gt;summarize&lt;/code&gt;方法，&lt;code&gt;item&lt;/code&gt;就需要实现两个trait：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; notify&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Display&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;泛型的trait bound语法可以这样写：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; notify&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Display&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;tong-guo-wherejian-hua-trait-bound&quot;&gt;通过where简化trait bound&lt;a class=&quot;zola-anchor&quot; href=&quot;#tong-guo-wherejian-hua-trait-bound&quot; aria-label=&quot;Anchor link for: tong-guo-wherejian-hua-trait-bound&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;泛型参数多的时候，代码难以阅读：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; some_function&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Display&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; U&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Debug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; u&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;U&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以使用&lt;code&gt;where&lt;/code&gt;子句来简化：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; some_function&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; U&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; u&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;U&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; i32&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    where&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Display&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;          U&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Clone&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Debug&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;fan-hui-shi-xian-traitde-lei-xing&quot;&gt;返回实现trait的类型&lt;a class=&quot;zola-anchor&quot; href=&quot;#fan-hui-shi-xian-traitde-lei-xing&quot; aria-label=&quot;Anchor link for: fan-hui-shi-xian-traitde-lei-xing&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; returns_summarizable&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Tweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;horse_ebooks&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        content&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;of course, as you probably already know, people&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        reply&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        retweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过使用&lt;code&gt;impl Summary&lt;/code&gt;作为返回值，我们可以返回任何实现了&lt;code&gt;Summary&lt;/code&gt;trait的类型，这里返回的是&lt;code&gt;Tweet&lt;/code&gt;类型。&lt;/p&gt;
&lt;p&gt;不过这只适用于返回一种类型，若使返回两种就不行：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; returns_summarizable&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;switch&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; bool&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Summary&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    if&lt;/span&gt;&lt;span&gt; switch&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        NewsArticle&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            headline&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Penguins win the Stanley Cup Championship!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            location&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Pittsburgh, PA, USA&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            author&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Iceburgh&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            content&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;                &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The Pittsburgh Penguins once again are the best hockey team in the NHL.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;            )&lt;/span&gt;&lt;span&gt;，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Tweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;horse_ebooks&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            content&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;of course, as you probably already know, people&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            reply&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            retweet&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里尝试返回&lt;code&gt;NewsArticle&lt;/code&gt;或&lt;code&gt;Tweet&lt;/code&gt;类型，编译器会报错。&lt;/p&gt;
&lt;h1 id=&quot;shi-yong-trait-boundyou-tiao-jian-di-shi-xian-fang-fa&quot;&gt;使用trait bound有条件地实现方法&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-trait-boundyou-tiao-jian-di-shi-xian-fang-fa&quot; aria-label=&quot;Anchor link for: shi-yong-trait-boundyou-tiao-jian-di-shi-xian-fang-fa&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;使用带有trait bound的&lt;code&gt;impl&lt;/code&gt;块可以为实现了特定trait的类型实现方法：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;fmt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Display&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Pair&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Pair&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; Self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;        Self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Display&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; PartialOrd&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Pair&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; cmp_display&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;x &lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;y &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;            println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The largest member is x = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; else&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;            println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The largest member is y = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里&lt;code&gt;cmp_display&lt;/code&gt;方法只对实现了&lt;code&gt;Display&lt;/code&gt;和&lt;code&gt;PartialOrd&lt;/code&gt;trait的类型有效。同理也可以对实现了特定trait的类型实现trait，称作&lt;em&gt;blanket implementation&lt;/em&gt;，例如：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Display&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; ToString&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;    //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; --snip--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;标准库有这些blanket implementation，我们可以对任何实现了&lt;code&gt;Display&lt;/code&gt;trait的类型使用&lt;code&gt;ToString&lt;/code&gt;里面的方法。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust泛型</title>
          <pubDate>Fri, 18 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-syntax/</link>
          <guid>https://www.microrat.com/blog/rust-syntax/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-syntax/">&lt;p&gt;使用泛型定义函数签名或结构体，枚举，方法等，就可以在不同数据类型中使用，而不需要重复定义。&lt;/p&gt;
&lt;h1 id=&quot;zai-han-shu-ding-yi-zhong-shi-yong-fan-xing&quot;&gt;在函数定义中使用泛型&lt;a class=&quot;zola-anchor&quot; href=&quot;#zai-han-shu-ding-yi-zhong-shi-yong-fan-xing&quot; aria-label=&quot;Anchor link for: zai-han-shu-ding-yi-zhong-shi-yong-fan-xing&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; largest_i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    for&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        if&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    largest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; largest_char&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    for&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        if&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    largest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; number_list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;34&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 25&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 65&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; largest_i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;number_list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The largest number is &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; char_list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;q&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; largest_char&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;char_list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The largest char is &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可见上面两个函数的代码几乎一致，只是类型不同，因此可以写一个新函数使用泛型来简化代码。&lt;br&gt;
参数化这个新函数，可以定义一个类型参数，并在函数签名中使用它，在这里使用&lt;code&gt;T&lt;/code&gt;，将参数声明在函数名称与参数列表中间的尖括号中，如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里表示，函数largest有泛型类型T，他的参数list是T的切片，返回值也是T的引用。&lt;/p&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    for&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        if&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    largest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; number_list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;34&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 25&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 65&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;number_list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The largest number is &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; char_list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;m&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;q&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; largest&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;char_list&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The largest char is &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译器会根据传入的参数类型，自动推断出T的类型，因此不需要显式地声明T的类型，但是代码目前不能编译，因为&lt;code&gt;&amp;gt;&lt;/code&gt;并不能使用于所有可能类型，&lt;code&gt;std::cmp::PartialOrd&lt;/code&gt;这个trait定义了&lt;code&gt;&amp;gt;&lt;/code&gt;这个方法，因此需要将T限制为实现了&lt;code&gt;PartialOrd&lt;/code&gt;这个trait的类型才能编译。&lt;/p&gt;
&lt;h1 id=&quot;jie-gou-ti-ding-yi-zhong-shi-yong-fan-xing&quot;&gt;结构体定义中使用泛型&lt;a class=&quot;zola-anchor&quot; href=&quot;#jie-gou-ti-ding-yi-zhong-shi-yong-fan-xing&quot; aria-label=&quot;Anchor link for: jie-gou-ti-ding-yi-zhong-shi-yong-fan-xing&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; integer&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; float&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里定义了一个结构体Point，它有两个字段x和y，他们的类型都是T，T是一个泛型类型参数，因此Point可以用于任何类型，如i32，f64，char等。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-tip&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;💡 提示&lt;/p&gt;&lt;p&gt;这里只使用了一个泛型类型，表明&lt;code&gt;x&lt;/code&gt;和&lt;code&gt;y&lt;/code&gt;的类型相同，如果创建一个&lt;code&gt;x&lt;/code&gt;和&lt;code&gt;y&lt;/code&gt;类型不同的&lt;code&gt;Point&lt;/code&gt;，编译器会报错。&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&quot;mei-ju-ding-yi-zhong-shi-yong-fan-xing&quot;&gt;枚举定义中使用泛型&lt;a class=&quot;zola-anchor&quot; href=&quot;#mei-ju-ding-yi-zhong-shi-yong-fan-xing&quot; aria-label=&quot;Anchor link for: mei-ju-ding-yi-zhong-shi-yong-fan-xing&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Option&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Some&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    None&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; E&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Err&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;E&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里定义了两个枚举，Option和Result，他们都有一个泛型类型参数，Option的泛型类型参数T表示Some的值，Result的泛型类型参数T表示Ok的值，泛型类型参数E表示Err的值。&lt;/p&gt;
&lt;h1 id=&quot;fang-fa-ding-yi-zhong-shi-yong-fan-xing&quot;&gt;方法定义中使用泛型&lt;a class=&quot;zola-anchor&quot; href=&quot;#fang-fa-ding-yi-zhong-shi-yong-fan-xing&quot; aria-label=&quot;Anchor link for: fang-fa-ding-yi-zhong-shi-yong-fan-xing&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;        &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;p.x = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里定义了一个x方法用来返回Point的x字段的引用，这个方法使用了泛型类型参数T，因此它可以用于任何类型的Point，如Point&lt;i32&gt;，Point&lt;f64&gt;等。&lt;/p&gt;
&lt;p&gt;在定义方法时也可以指定限制，如：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;f32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; distance_from_origin&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; f32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        (&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;powi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;powi&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;sqrt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码表示只有Point&lt;f32&gt;类型的Point结构体才能调用distance_from_origin方法，而其他类型的实例没有这个方法。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;需要在impl后面加上&lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt;来指定泛型类型参数T，编译器才能知道尖括号中的类型是泛型而不是具体类型。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;泛型并不是总和结构体方法签名中的泛型是同一类型：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;X1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Y1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; X1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Y1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;X1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Y1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;X1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Y1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; mixup&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;X2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Y2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; other&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;X2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Y2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;X1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Y2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt; self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span&gt; other&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; p1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; p2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Point&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Hello&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; p3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; p1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;mixup&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;p2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;p3.x = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;, p3.y = &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; p3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; p3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里定义了一个mixup方法，它接受一个Point类型的参数other，返回一个Point类型的值，可见一些泛型通过impl声明，而一些通过方法声明。&lt;/p&gt;
&lt;h1 id=&quot;fan-xing-dai-ma-de-xing-neng&quot;&gt;泛型代码的性能&lt;a class=&quot;zola-anchor&quot; href=&quot;#fan-xing-dai-ma-de-xing-neng&quot; aria-label=&quot;Anchor link for: fan-xing-dai-ma-de-xing-neng&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Rust会在编译时进行代码的单态化（monomorphization），将泛型代码转换为针对具体类型的代码，因此泛型代码没有额外的性能开销。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust的错误处理</title>
          <pubDate>Thu, 17 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-panic/</link>
          <guid>https://www.microrat.com/blog/rust-panic/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-panic/">&lt;p&gt;Rust的错误主要分可恢复（recoverable）和不可恢复（unrecoverable）两种，对于可恢复错误，只用报告问题并重试操作，而对于不可恢复错误则需要立即停止程序。可恢复错误通过&lt;code&gt;Result&lt;/code&gt;类型来处理，不可恢复错误通过&lt;code&gt;panic!&lt;/code&gt;宏来处理。&lt;/p&gt;
&lt;h1 id=&quot;yong-panic-chu-li-bu-ke-hui-fu-de-cuo-wu&quot;&gt;用panic!处理不可恢复的错误&lt;a class=&quot;zola-anchor&quot; href=&quot;#yong-panic-chu-li-bu-ke-hui-fu-de-cuo-wu&quot; aria-label=&quot;Anchor link for: yong-panic-chu-li-bu-ke-hui-fu-de-cuo-wu&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;执行会造成代码panic的操作（越界访问数组）或调用&lt;code&gt;panic!&lt;/code&gt;宏，都会造成程序panic，这是panic会打印错误信息，展开并清理栈数据然后退出。通过环境变量可以让Rust在panic时打印调用堆栈（call stack）以便定位panic的原因。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;panic时也可选择直接终止（abort），不清理数据就退出，内存需要由操作系统清理。在&lt;code&gt;Cargo.toml&lt;/code&gt;的&lt;code&gt;[profile]&lt;/code&gt;添加&lt;code&gt;panic = &#39;abort&#39;&lt;/code&gt;即可，例如要在release模式下panic时直接终止，则：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;release&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;panic&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;abort&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;直接调用panic!宏：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    panic!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;crash and burn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行结果：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;thread&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; panicked&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; at&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; src/main.rs:2:5:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;crash&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; and&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; burn&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;note:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; `&lt;/span&gt;&lt;span&gt;RUST_BACKTRACE&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; environment&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; variable&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; display&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; backtrace&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里可以看到panic的位置，也告诉我们可以使用&lt;code&gt;RUST_BACKTRACE=1&lt;/code&gt;环境变量来显示backtrace。&lt;/p&gt;
&lt;h2 id=&quot;shi-yong-panic-hong-de-backtrace&quot;&gt;使用panic!宏的backtrace&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-panic-hong-de-backtrace&quot; aria-label=&quot;Anchor link for: shi-yong-panic-hong-de-backtrace&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;将&lt;code&gt;RUST_BACKTRACE&lt;/code&gt;环境变量设置为任何不是0的值来获取backtrace，输入&lt;code&gt;RUST_BACKTRACE=1 cargo run&lt;/code&gt;运行程序。&lt;br&gt;
需要获取带有带有这些信息的backtrace，需要启用debug标识，而在不使用&lt;code&gt;--release&lt;/code&gt;标识编译时，debug标识默认是开启的。&lt;/p&gt;
&lt;h1 id=&quot;yong-resultchu-li-ke-hui-fu-de-cuo-wu&quot;&gt;用Result处理可恢复的错误&lt;a class=&quot;zola-anchor&quot; href=&quot;#yong-resultchu-li-ke-hui-fu-de-cuo-wu&quot; aria-label=&quot;Anchor link for: yong-resultchu-li-ke-hui-fu-de-cuo-wu&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;Result&lt;/code&gt;类型表示可能成功（&lt;code&gt;Ok&lt;/code&gt;）或失败（&lt;code&gt;Err&lt;/code&gt;）的操作，&lt;code&gt;Result&lt;/code&gt;类型是枚举，定义如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; E&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Err&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;E&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;fs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hello.txt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;File::open&lt;/code&gt;的返回值是&lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt;，当&lt;code&gt;File::open&lt;/code&gt;成功时，&lt;code&gt;greeting_file_result&lt;/code&gt;变量的值是&lt;code&gt;Ok&lt;/code&gt;，其中&lt;code&gt;Ok&lt;/code&gt;的值是&lt;code&gt;File&lt;/code&gt;类型的文件句柄；当&lt;code&gt;File::open&lt;/code&gt;失败时，&lt;code&gt;greeting_file_result&lt;/code&gt;的值是&lt;code&gt;Err&lt;/code&gt;，其中&lt;code&gt;Err&lt;/code&gt;的值是&lt;code&gt;std::io::Error&lt;/code&gt;类型的错误对象。&lt;/p&gt;
&lt;p&gt;若要实现文件读取操作，考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;fs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; greeting_file_result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hello.txt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; greeting_file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; match&lt;/span&gt;&lt;span&gt; greeting_file_result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Err&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; panic!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Problem opening the file: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里如果&lt;code&gt;File::open&lt;/code&gt;成功，则&lt;code&gt;greeting_file&lt;/code&gt;的值是&lt;code&gt;File&lt;/code&gt;类型的文件句柄，否则程序会panic并打印错误信息，告诉我们哪里出错了。&lt;/p&gt;
&lt;h2 id=&quot;pi-pei-bu-tong-cuo-wu&quot;&gt;匹配不同错误&lt;a class=&quot;zola-anchor&quot; href=&quot;#pi-pei-bu-tong-cuo-wu&quot; aria-label=&quot;Anchor link for: pi-pei-bu-tong-cuo-wu&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;上述代码无论什么错误都会调用&lt;code&gt;panic!&lt;/code&gt;宏，但有时我们希望对不同的错误采取不同的处理方式，考虑如下代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;fs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;ErrorKind&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; greeting_file_result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hello.txt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; greeting_file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; match&lt;/span&gt;&lt;span&gt; greeting_file_result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Err&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; match&lt;/span&gt;&lt;span&gt; error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;kind&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;            ErrorKind&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;NotFound&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; match&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hello.txt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;                Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;fc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; fc&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;                Err&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; panic!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Problem creating the file: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; e&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;            }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            other_error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; panic!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Problem opening the file: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; other_error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里如果&lt;code&gt;File::open&lt;/code&gt;失败，则判断错误类型，如果错误类型是&lt;code&gt;ErrorKind::NotFound&lt;/code&gt;，则尝试创建文件，如果创建文件也失败，则调用&lt;code&gt;panic!&lt;/code&gt;宏，否则返回创建的文件句柄；如果错误类型不是&lt;code&gt;ErrorKind::NotFound&lt;/code&gt;，则调用&lt;code&gt;panic!&lt;/code&gt;宏。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;处理&lt;code&gt;Result&lt;/code&gt;类型时，除了&lt;code&gt;match&lt;/code&gt;语句外，使用闭包（closure）会使代码更加简洁。&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;shi-bai-shi-panicde-jian-xie-unwarphe-expect&quot;&gt;失败时panic的简写：unwarp和expect&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-bai-shi-panicde-jian-xie-unwarphe-expect&quot; aria-label=&quot;Anchor link for: shi-bai-shi-panicde-jian-xie-unwarphe-expect&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Result&lt;/code&gt;类型定义了&lt;code&gt;unwarp&lt;/code&gt;方法，如果&lt;code&gt;Result&lt;/code&gt;是&lt;code&gt;Ok&lt;/code&gt;，则返回&lt;code&gt;Ok&lt;/code&gt;中的值，否则调用&lt;code&gt;panic!&lt;/code&gt;宏。&lt;code&gt;expect&lt;/code&gt;方法与&lt;code&gt;unwarp&lt;/code&gt;方法类似，但&lt;code&gt;expect&lt;/code&gt;方法接受一个错误信息参数，当&lt;code&gt;Result&lt;/code&gt;是&lt;code&gt;Err&lt;/code&gt;时，&lt;code&gt;expect&lt;/code&gt;方法会打印错误信息并调用&lt;code&gt;panic!&lt;/code&gt;宏。&lt;/p&gt;
&lt;h2 id=&quot;chuan-bo-cuo-wu&quot;&gt;传播错误&lt;a class=&quot;zola-anchor&quot; href=&quot;#chuan-bo-cuo-wu&quot; aria-label=&quot;Anchor link for: chuan-bo-cuo-wu&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;fs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Read&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; read_username_from_file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; io&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; username_file_result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hello.txt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; username_file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; match&lt;/span&gt;&lt;span&gt; username_file_result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Err&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; return&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Err&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    match&lt;/span&gt;&lt;span&gt; username_file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;read_to_string&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mut&lt;/span&gt;&lt;span&gt; username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;        Err&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Err&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里如果成功，则返回&lt;code&gt;OK&lt;/code&gt;中的值，否则返回同样的&lt;code&gt;Err&lt;/code&gt;，这就是传播错误。&lt;/p&gt;
&lt;h2 id=&quot;yong-yun-suan-fu-chuan-bo-cuo-wu&quot;&gt;用?运算符传播错误&lt;a class=&quot;zola-anchor&quot; href=&quot;#yong-yun-suan-fu-chuan-bo-cuo-wu&quot; aria-label=&quot;Anchor link for: yong-yun-suan-fu-chuan-bo-cuo-wu&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;考虑下面代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;fs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Read&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; read_username_from_file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; io&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; username_file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hello.txt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    username_file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;read_to_string&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mut&lt;/span&gt;&lt;span&gt; username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在Result后加上&lt;code&gt;?&lt;/code&gt;运算符，如果&lt;code&gt;Result&lt;/code&gt;是&lt;code&gt;Ok&lt;/code&gt;，则返回&lt;code&gt;Ok&lt;/code&gt;中的值，否则返回&lt;code&gt;Err&lt;/code&gt;，与上面的&lt;code&gt;match&lt;/code&gt;表达式一致。&lt;br&gt;
与&lt;code&gt;match&lt;/code&gt;不用的是，&lt;code&gt;?&lt;/code&gt;会将错误值传递给&lt;code&gt;from&lt;/code&gt;函数，它定义于标准库的&lt;code&gt;From&lt;/code&gt; trait中，用于将错误类型从一种转换为另一种，在有自定义的错误类型时可以节省代码。&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;?&lt;/code&gt;之后使用链式方法调用进一步缩短代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;fs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;io&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#D20F39, #F38BA8);&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Read&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; read_username_from_file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; io&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hello.txt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;read_to_string&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mut&lt;/span&gt;&lt;span&gt; username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可见确实节省了很多代码。&lt;/p&gt;
&lt;p&gt;下面还有更为简短的写法：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span&gt;fs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span&gt;io&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; read_username_from_file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);&quot;&gt; io&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;    fs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;read_to_string&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hello.txt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;fs::read_to_string&lt;/code&gt;函数会打开文件，读取文件内容，然后将内容放入&lt;code&gt;String&lt;/code&gt;中，并返回&lt;code&gt;Result&lt;/code&gt;类型。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-warning&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;⚠️ 警告&lt;/p&gt;&lt;p&gt;&lt;code&gt;?&lt;/code&gt;运算符只能用于返回&lt;code&gt;Result&lt;/code&gt;或&lt;code&gt;Option&lt;/code&gt;类型的函数，如果函数返回的是其他类型，则不能使用&lt;code&gt;?&lt;/code&gt;运算符。&lt;br&gt;
一般&lt;code&gt;main&lt;/code&gt;函数返回&lt;code&gt;()&lt;/code&gt;，修改后的&lt;code&gt;main&lt;/code&gt;函数也可以使用&lt;code&gt;?&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;fs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Result&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Box&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;dyn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Error&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; greeting_file&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; File&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hello.txt&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Ok&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id=&quot;zong-jie&quot;&gt;总结&lt;a class=&quot;zola-anchor&quot; href=&quot;#zong-jie&quot; aria-label=&quot;Anchor link for: zong-jie&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;本文讲解了Rust的错误处理，介绍了&lt;code&gt;panic!&lt;/code&gt;宏和&lt;code&gt;Result&lt;/code&gt;类型，并介绍了如何使用&lt;code&gt;?&lt;/code&gt;运算符传播错误。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust的集合（collections）</title>
          <pubDate>Wed, 16 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-collections/</link>
          <guid>https://www.microrat.com/blog/rust-collections/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-collections/">&lt;p&gt;Rust的标准库里有一系列数据结构，称作集合（collections）。这里讲解三种被广泛使用的集合：vector、string和hashmap。&lt;/p&gt;
&lt;h1 id=&quot;vector&quot;&gt;Vector&lt;a class=&quot;zola-anchor&quot; href=&quot;#vector&quot; aria-label=&quot;Anchor link for: vector&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;vector是一个动态数组，可以存储多个值，并且值类型相同。vector是可变的，可以添加、删除和修改元素。&lt;/p&gt;
&lt;h2 id=&quot;chuang-jian-vector&quot;&gt;创建vector&lt;a class=&quot;zola-anchor&quot; href=&quot;#chuang-jian-vector&quot; aria-label=&quot;Anchor link for: chuang-jian-vector&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;创建一个空的vector：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里创建了个叫v的vector，类型是i32，初始为空。&lt;/p&gt;
&lt;p&gt;创建一个包含初始值的vector：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用了vec!宏，这个宏会根据提供的类型判断出vector的类型，并创建一个包含初始值的vector。&lt;/p&gt;
&lt;h2 id=&quot;geng-xin-vector&quot;&gt;更新vector&lt;a class=&quot;zola-anchor&quot; href=&quot;#geng-xin-vector&quot; aria-label=&quot;Anchor link for: geng-xin-vector&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;向vector中添加元素：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;8&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用了push方法向vector中添加元素。&lt;/p&gt;
&lt;h2 id=&quot;du-qu-vectorzhong-de-yuan-su&quot;&gt;读取vector中的元素&lt;a class=&quot;zola-anchor&quot; href=&quot;#du-qu-vectorzhong-de-yuan-su&quot; aria-label=&quot;Anchor link for: du-qu-vectorzhong-de-yuan-su&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;读取vector中的元素有两种方式：索引和get方法。&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; third&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The third element is &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; third&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; third&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; Option&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#04A5E5, #89DCEB);&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;match&lt;/span&gt;&lt;span&gt; third&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    Some&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;third&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;The third element is &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; third&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    None&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;There is no third element.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里分别使用索引和get两种方法来读取vector中的元素，可以看到get方法的返回值是一个Option类型，这是因为索引可能超出vector的范围，所以需要使用Option来处理这种情况。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-important&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;❗ 重要&lt;/p&gt;&lt;p&gt;注意：使用索引访问vector中的元素时，如果索引超出了vector的范围，会导致panic，而使用get方法访问时，如果索引超出了vector的范围，会返回None。&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;bian-li-vector&quot;&gt;遍历vector&lt;a class=&quot;zola-anchor&quot; href=&quot;#bian-li-vector&quot; aria-label=&quot;Anchor link for: bian-li-vector&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;可以使用for遍历vector中的元素：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;for&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mut&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;for&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mut&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;    *&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里分别使用了for遍历vector中的元素，以及for遍历vector中的可变引用，并修改了元素。&lt;/p&gt;
&lt;h2 id=&quot;shi-yong-mei-ju-lai-cun-chu-duo-ge-lei-xing-de-zhi&quot;&gt;使用枚举来存储多个类型的值&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-mei-ju-lai-cun-chu-duo-ge-lei-xing-de-zhi&quot; aria-label=&quot;Anchor link for: shi-yong-mei-ju-lai-cun-chu-duo-ge-lei-xing-de-zhi&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;可以使用枚举来存储多个类型的值，例如：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; SpreadsheetCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    Int&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    Float&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;f64&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    Text&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; row&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; vec!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    SpreadsheetCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Int&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    SpreadsheetCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;    SpreadsheetCell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;Float&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里定义了一个枚举SpreadsheetCell，它有三个变体：Int、Float和Text，分别对应i32、f64和String类型。然后使用vec!宏创建了一个包含SpreadsheetCell类型的vector。&lt;/p&gt;
&lt;h1 id=&quot;string&quot;&gt;String&lt;a class=&quot;zola-anchor&quot; href=&quot;#string&quot; aria-label=&quot;Anchor link for: string&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;String是一个可变的、动态分配的UTF-8编码的字符串，是一个vector的封装，可以存储多个字符。&lt;/p&gt;
&lt;h2 id=&quot;chuang-jian-string&quot;&gt;创建String&lt;a class=&quot;zola-anchor&quot; href=&quot;#chuang-jian-string&quot; aria-label=&quot;Anchor link for: chuang-jian-string&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;创建一个空的String：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里创建了一个叫s的String，初始为空。&lt;/p&gt;
&lt;p&gt;创建带初始值的字符串：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;initial contents&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;initial contents&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;to_string&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里分别使用了String::from和to_string方法创建了一个带初始值的String。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;注意：字符串是UTF-8编码的，所以可以存储任何Unicode字符。&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;geng-xin-string&quot;&gt;更新String&lt;a class=&quot;zola-anchor&quot; href=&quot;#geng-xin-string&quot; aria-label=&quot;Anchor link for: geng-xin-string&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用push_str方法添加slice到String中，使用push方法添加单个字符到String中：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;foo&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;push_str&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;bar&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;l&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里分别使用了push_str和push方法向String中添加了slice和字符。&lt;/p&gt;
&lt;h2 id=&quot;shi-yong-huo-format-hong-lian-jie-zi-fu-chuan&quot;&gt;使用’+’或format!宏连接字符串&lt;a class=&quot;zola-anchor&quot; href=&quot;#shi-yong-huo-format-hong-lian-jie-zi-fu-chuan&quot; aria-label=&quot;Anchor link for: shi-yong-huo-format-hong-lian-jie-zi-fu-chuan&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;可以使用+连接字符串：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; s1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Hello, &lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; s2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;world!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; s3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; s1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;s2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; //&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt; note s1 has been moved here and can no longer be used&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用了+运算符连接了两个String，注意s1被移动了，所以不能再使用s1。s2是一个引用，在这里会转移成&amp;amp;str，所以可以连接，之后也可以继续使用。&lt;/p&gt;
&lt;p&gt;在连接多个字符串时，可以使用format!宏：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; s1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;tic&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; s2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;tac&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; s3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;toe&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; format!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; s1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; s2&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; s3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用了format!宏连接了三个String，并返回了一个新的String，format!宏和println!宏类似，只不过不是打印而是返回结果。&lt;/p&gt;
&lt;h2 id=&quot;stringsuo-yin&quot;&gt;String索引&lt;a class=&quot;zola-anchor&quot; href=&quot;#stringsuo-yin&quot; aria-label=&quot;Anchor link for: stringsuo-yin&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Rust中的String不可索引，String是Vec&lt;u8&gt;的封装，由于使用UTF-8编码，一个字符可能占用多个字节，所以不能像数组那样使用索引访问字符串中的字符。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;另外：索引操作预期需要常数时间O(1)，但Rust计算一个字符需要遍历整个字符串来确认有效字符。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;使用索引创建字符串slice是可行的：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; hello&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Здравствуйте&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;hello&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用了索引创建了一个字符串slice，s的值是“Зд“，注意索引是从0开始的，所以s的长度是4。（这些字符每个占用2个字节）&lt;br&gt;&lt;/p&gt;
&lt;div class=&quot;admonition admonition-caution&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;🔥 谨慎&lt;/p&gt;&lt;p&gt;如果获取&lt;code&gt;&amp;amp;hello[0..1]&lt;/code&gt;，会报错，因为第一个字符是两个字节。&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;bian-li-string&quot;&gt;遍历String&lt;a class=&quot;zola-anchor&quot; href=&quot;#bian-li-string&quot; aria-label=&quot;Anchor link for: bian-li-string&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;遍历String需要明确表示的是字符还是字节，可以使用chars方法遍历字符，使用bytes方法遍历字节：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;for&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Зд&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;chars&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;for&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Зд&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;bytes&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里分别使用了chars和bytes方法遍历了字符串中的字符和字节，输出如下内容：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;З&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;д&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;208&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;151&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;208&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;180&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用了chars方法遍历了字符串中的字符，使用bytes方法遍历了字符串中的字节。&lt;/p&gt;
&lt;h1 id=&quot;hashmap&quot;&gt;HashMap&lt;a class=&quot;zola-anchor&quot; href=&quot;#hashmap&quot; aria-label=&quot;Anchor link for: hashmap&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;HashMap&amp;lt;K,V&amp;gt;储存了一个键值对的映射。哈希map用于需要任何类型作为key来寻找数据的情况，这里简单介绍HashMap。&lt;/p&gt;
&lt;h2 id=&quot;chuang-jian-hashmap&quot;&gt;创建HashMap&lt;a class=&quot;zola-anchor&quot; href=&quot;#chuang-jian-hashmap&quot; aria-label=&quot;Anchor link for: chuang-jian-hashmap&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;创建一个空的HashMap：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;collections&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Yellow&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用了HashMap::new方法创建了一个空的HashMap，然后使用insert方法向HashMap中添加了两个键值对。&lt;br&gt;
像vector一样，hashmap的键类型和值类型必须相同，这里使用了String和i32类型。&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;注意：要先使用use std::collections::HashMap引入HashMap，由于HashMap相对Vector和String使用频率较低，所以没被prelude自动引用。&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;fang-wen-hashmapzhong-de-zhi&quot;&gt;访问HashMap中的值&lt;a class=&quot;zola-anchor&quot; href=&quot;#fang-wen-hashmapzhong-de-zhi&quot; aria-label=&quot;Anchor link for: fang-wen-hashmapzhong-de-zhi&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;使用get方法访问HashMap中的值：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;collections&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Yellow&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; team_name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; score&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;team_name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;copied&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;unwrap_or&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;get方法返回一个Option类型，如果键存在，则返回Some值，否则返回None，这里使用了copied方法获取一个Option&lt;i32&gt;而不是Option&amp;lt;&amp;amp;i32&amp;gt;，接着用unwrap_or(0)方法获取值，如果Option是None，则返回0。&lt;/p&gt;
&lt;p&gt;遍历HashMap中的值也可以用for：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;collections&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Yellow&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; (&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;    println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; key&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用了for遍历了HashMap中的键值对，并打印了键和值，输出如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Blue: 10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Yellow: 50&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;hashmaphe-suo-you-quan&quot;&gt;hashmap和所有权&lt;a class=&quot;zola-anchor&quot; href=&quot;#hashmaphe-suo-you-quan&quot; aria-label=&quot;Anchor link for: hashmaphe-suo-you-quan&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;对于实现Copy trait的类型，例如i32，HashMap会将值复制到哈希map中，对于String这样有所有权的值，HashMap会将值的移动并获取所有权：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;collections&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; field_name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Favorite color&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; field_value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; map&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;map&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;field_name&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; field_value&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里创建了一个String类型的field_name和field_value，然后使用insert方法将它们插入到HashMap中，之后field_name和field_value的所有权被移动到了HashMap中，所以不能再使用它们。&lt;br&gt;
如果将值的引用插入到HashMap中，那么值不会被移动，但是这些引用所指的值必须至少在hashmap有效时有效。&lt;/p&gt;
&lt;h2 id=&quot;geng-xin-hashmap&quot;&gt;更新HashMap&lt;a class=&quot;zola-anchor&quot; href=&quot;#geng-xin-hashmap&quot; aria-label=&quot;Anchor link for: geng-xin-hashmap&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;每一个键只能关联一个值，所以在处理一个键时，需要先检查键是否存在，如果存在则更新值，如果不存在则插入键值对。&lt;br&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 25&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里先插入了一个键值对，然后又插入了一个键值对，但是键是相同的，所以第二个键值对会覆盖第一个键值对，输出如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&amp;quot;Blue&amp;quot;: 25}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用entry可以更简洁的更新HashMap：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;collections&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;entry&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Yellow&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;or_insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;entry&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Blue&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;or_insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; scores&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;entry返回值是一个枚举Entry，代表可能存在也可能不存在的值。使用Entry的or_insert方法在键值存在时返回这个值的可变引用，如果不存在则将参数作为值插入，并返回这个新值的可变引用。这里使用了or_insert方法更新了HashMap中的值，输出如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&amp;quot;Yellow&amp;quot;: 50, &amp;quot;Blue&amp;quot;: 10}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果要根据旧值更新一个值，考虑如下代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);font-style: italic;&quot;&gt;这里是计数一个字符串中每一单词出现的次数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt; std&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;collections&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt;HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;hello world wonderful world&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mut&lt;/span&gt;&lt;span&gt; map&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);font-style: italic;&quot;&gt; HashMap&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;for&lt;/span&gt;&lt;span&gt; word&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; in&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;split_whitespace&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    let&lt;/span&gt;&lt;span&gt; count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; map&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;entry&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span&gt;word&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;or_insert&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;    *&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; +=&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;println!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;:?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;,&lt;/span&gt;&lt;span&gt; map&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里使用了entry方法获取了键的可变引用，然后使用*count += 1更新了值，输出如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&amp;quot;hello&amp;quot;: 1, &amp;quot;world&amp;quot;: 2, &amp;quot;wonderful&amp;quot;: 1}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中，split_whitespace方法返回一个由空格分割text值子slice的迭代器，or_insert方法返回一个可变引用，所以需要使用*count来更新值。&lt;/p&gt;
&lt;h1 id=&quot;zong-jie&quot;&gt;总结&lt;a class=&quot;zola-anchor&quot; href=&quot;#zong-jie&quot; aria-label=&quot;Anchor link for: zong-jie&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;本文介绍了Rust中的Vector、String和HashMap，Vector是动态数组，String是字符串，HashMap是哈希表，它们都是Rust中常用的集合类型，其中HashMap使用时要用&lt;code&gt;use std::collections::HashMap&lt;/code&gt;引入，而Vector和String可以直接使用。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Rust的项目结构</title>
          <pubDate>Tue, 15 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/rust-proj/</link>
          <guid>https://www.microrat.com/blog/rust-proj/</guid>
          <description xml:base="https://www.microrat.com/blog/rust-proj/">&lt;p&gt;crate是Rust的最小代码单位，有二进制项和库两种形式，二进制项有main函数，库没有main函数。包（package）是提供一系列功能的一个或多个crate，一个包会包含一个&lt;code&gt;Cargo.toml&lt;/code&gt;文件，包可以包含一个库crate（library crate）或任意多个二进制crate（binary crate），但至少需要包含一个crate。&lt;br&gt;
用Cargo创建一个新的包，里面会有&lt;code&gt;src&lt;/code&gt;文件夹和&lt;code&gt;Cargo.toml&lt;/code&gt;文件，&lt;code&gt;src&lt;/code&gt;文件夹里面有一个&lt;code&gt;main.rs&lt;/code&gt;文件，这是与包同名的二进制crate根，如果有&lt;code&gt;lib.rs&lt;/code&gt;文件，则是与包同名的库crate根。&lt;br&gt;&lt;/p&gt;
&lt;div class=&quot;admonition admonition-tip&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;💡 提示&lt;/p&gt;&lt;p&gt;将文件放在&lt;code&gt;src/bin&lt;/code&gt;文件夹下，Cargo会自动将其视为一个独立的二进制crate，并生成一个对应的二进制crate的根。&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&quot;mo-kuai-ying-yong&quot;&gt;模块应用&lt;a class=&quot;zola-anchor&quot; href=&quot;#mo-kuai-ying-yong&quot; aria-label=&quot;Anchor link for: mo-kuai-ying-yong&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;模块化是一种非常重要的编程范式，它可以帮助开发者编写更清晰、更易于维护、更易于扩展的代码。&lt;/p&gt;
&lt;h2 id=&quot;mo-kuai-sheng-ming&quot;&gt;模块声明&lt;a class=&quot;zola-anchor&quot; href=&quot;#mo-kuai-sheng-ming&quot; aria-label=&quot;Anchor link for: mo-kuai-sheng-ming&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;编译器从crate根文件（&lt;code&gt;src/main.rs&lt;/code&gt;或&lt;code&gt;src/lib.rs&lt;/code&gt;）开始寻找需要被编译的代码，如果你在crate根文件中声明一个新模块，例如使用&lt;code&gt;mod my_module;&lt;/code&gt;，编译器会在crate根目录下寻找&lt;code&gt;src/my_module.rs&lt;/code&gt;文件或&lt;code&gt;src/my_module/mod.rs&lt;/code&gt;文件。&lt;br&gt;&lt;/p&gt;
&lt;h2 id=&quot;zi-mo-kuai-sheng-ming&quot;&gt;子模块声明&lt;a class=&quot;zola-anchor&quot; href=&quot;#zi-mo-kuai-sheng-ming&quot; aria-label=&quot;Anchor link for: zi-mo-kuai-sheng-ming&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;如果在&lt;code&gt;src/my_module.rs&lt;/code&gt;定义了&lt;code&gt;mod my_submodule;&lt;/code&gt;，编译器会在&lt;code&gt;src/my_module&lt;/code&gt;目录下寻找&lt;code&gt;my_submodule.rs&lt;/code&gt;文件或&lt;code&gt;my_submodule/mod.rs&lt;/code&gt;文件。&lt;br&gt;&lt;/p&gt;
&lt;h2 id=&quot;si-you-he-gong-you&quot;&gt;私有和公有&lt;a class=&quot;zola-anchor&quot; href=&quot;#si-you-he-gong-you&quot; aria-label=&quot;Anchor link for: si-you-he-gong-you&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;模块的代码默认对其父模块私有，如果想让模块中的项对父模块外部可见，可以使用&lt;code&gt;pub&lt;/code&gt;关键字。&lt;br&gt;&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;将结构体定义为&lt;code&gt;pub&lt;/code&gt;，则结构体的字段默认为私有，如果想让字段公有，需要使用&lt;code&gt;pub&lt;/code&gt;关键字。&lt;br&gt;
若结构体某个字段为私有，则需要提供一个关联函数来构建实例，否则外部无法创建实例。&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;useguan-jian-zi&quot;&gt;use关键字&lt;a class=&quot;zola-anchor&quot; href=&quot;#useguan-jian-zi&quot; aria-label=&quot;Anchor link for: useguan-jian-zi&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;use crate::my_module::my_submodule;&lt;/code&gt;，这会导入&lt;code&gt;my_submodule&lt;/code&gt;模块，之后就可以直接使用&lt;code&gt;my_submodule&lt;/code&gt;，而不需要&lt;code&gt;my_module::my_submodule&lt;/code&gt;。&lt;br&gt;&lt;/p&gt;
&lt;h1 id=&quot;mo-kuai-shu&quot;&gt;模块树&lt;a class=&quot;zola-anchor&quot; href=&quot;#mo-kuai-shu&quot; aria-label=&quot;Anchor link for: mo-kuai-shu&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑&lt;code&gt;src/lib.rs&lt;/code&gt;中的这样一段代码：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; front_of_house&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; hosting&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add_to_waitlist&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; seat_at_table&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; serving&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; take_order&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; serve_order&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; take_payment&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这段代码中模块树结构如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;crate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; └── front_of_house&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     ├── hosting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     │   ├── add_to_waitlist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     │   └── seat_at_table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     └── serving&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         ├── take_order&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         ├── serve_order&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         └── take_payment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用模块管理代码能让代码结构更清晰，更易于维护。&lt;/p&gt;
&lt;h1 id=&quot;yin-yong-mo-kuai&quot;&gt;引用模块&lt;a class=&quot;zola-anchor&quot; href=&quot;#yin-yong-mo-kuai&quot; aria-label=&quot;Anchor link for: yin-yong-mo-kuai&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;要调用模块中的函数，需要用到&lt;code&gt;::&lt;/code&gt;操作符，关于路径有绝对路径（absolute path）和相对路径（relative path）两种，绝对路径从&lt;code&gt;crate&lt;/code&gt;开始，相对路径从当前模块开始，使用&lt;code&gt;self&lt;/code&gt;关键字表示当前模块，&lt;code&gt;super&lt;/code&gt;关键字表示父模块。&lt;br&gt;&lt;/p&gt;
&lt;div class=&quot;admonition admonition-tip&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;💡 提示&lt;/p&gt;&lt;p&gt;使用&lt;code&gt;use crate::front_of_house::hosting;&lt;/code&gt;，这会导入&lt;code&gt;hosting&lt;/code&gt;模块，之后就可以直接使用&lt;code&gt;hosting&lt;/code&gt;，而不需要&lt;code&gt;front_of_house::hosting&lt;/code&gt;。use语句只适用于其所在作用域。&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;一般来讲，一个包同时包含二进制crate和库crate，此时二进制crate中只保留可执行文件的代码，被调用的代码都放在库crate中，模块树也应该定义在&lt;code&gt;src/lib.rs&lt;/code&gt;中。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;使用&lt;code&gt;pub use&lt;/code&gt;关键字可以将模块导入当前作用域后，其他模块也可以倒入，例如：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; front_of_house&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;    pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; mod&lt;/span&gt;&lt;span style=&quot;color: light-dark(#FE640B, #FAB387);&quot;&gt; hosting&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;        pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; add_to_waitlist&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; use&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; crate&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;front_of_house&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span&gt;hosting&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; fn&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; eat_at_restaurant&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#DF8E1D, #F9E2AF);&quot;&gt;    hosting&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;add_to_waitlist&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若不使用&lt;code&gt;pub use&lt;/code&gt;，外部代码需要使用路径
&lt;code&gt;restaurant::front_of_house::hosting::add_to_waitlist()&lt;/code&gt;来调用&lt;code&gt;add_to_waitlist&lt;/code&gt;函数。现在，外部代码可以使用&lt;code&gt;restaurant::hosting::add_to_waitlist()&lt;/code&gt;来调用&lt;code&gt;add_to_waitlist&lt;/code&gt;函数。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>Nix教程①：简单的开始</title>
          <pubDate>Fri, 11 Apr 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/nix1/</link>
          <guid>https://www.microrat.com/blog/nix1/</guid>
          <description xml:base="https://www.microrat.com/blog/nix1/">&lt;h1 id=&quot;ad-hoc-shell-huan-jing&quot;&gt;Ad hoc shell 环境&lt;a class=&quot;zola-anchor&quot; href=&quot;#ad-hoc-shell-huan-jing&quot; aria-label=&quot;Anchor link for: ad-hoc-shell-huan-jing&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;使用&lt;code&gt;nix-shell&lt;/code&gt;和&lt;code&gt;-p&lt;/code&gt;（&lt;code&gt;--packages&lt;/code&gt;）来创建一个Nix shell，在Nix shell中就可以使用这些包。输入&lt;code&gt;exit&lt;/code&gt;退出这个shell。&lt;br&gt;
如果需要直接运行，可以加&lt;code&gt;--run&lt;/code&gt;再加入命令，如：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;nix-shell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; python3&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-run&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;python3 --version&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这行命令会创建一个Nix shell，安装python3，然后运行&lt;code&gt;python3 --version&lt;/code&gt;命令。&lt;br&gt;&lt;/p&gt;
&lt;div class=&quot;admonition admonition-tip&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;💡 提示&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;可以在&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://search.nixos.org&quot;&gt;NixOS Search&lt;/a&gt;查找程序包。&lt;/li&gt;
&lt;li&gt;Nix shell里也可以嵌套使用Nix shell。&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id=&quot;ke-zhong-xian-huan-jing&quot;&gt;可重现环境&lt;a class=&quot;zola-anchor&quot; href=&quot;#ke-zhong-xian-huan-jing&quot; aria-label=&quot;Anchor link for: ke-zhong-xian-huan-jing&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;直接创建Nix shell可能会使环境不可重现，因为包的版本可能随时间变化。使用以下命令创建一个可重复实现的环境：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;nix-shell&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; git&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-run&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;git --version&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;-pure&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;I&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; nixpkgs=https://github.com/NixOS/nixpkgs/tarball/2a601aafdc5605a5133a2ca506a34a3a73377247&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-I&lt;/code&gt;参数指定了Nixpkgs的源，这里选的是github上一个特定的版本。&lt;code&gt;--pure&lt;/code&gt;参数忽略了系统的大多数环境变量，一般在需要隔离时使用。&lt;br&gt;&lt;/p&gt;
&lt;h1 id=&quot;ke-zhong-xian-jiao-ben&quot;&gt;可重现脚本&lt;a class=&quot;zola-anchor&quot; href=&quot;#ke-zhong-xian-jiao-ben&quot; aria-label=&quot;Anchor link for: ke-zhong-xian-jiao-ben&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;假设我们要运行以下脚本：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);font-style: italic;&quot;&gt;#!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);font-style: italic;&quot;&gt; /bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; https://github.com/NixOS/nixpkgs/releases.atom&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; xml2json&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; jq&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个脚本获取URL的XML将其转换为JSON，并更改格式以提高可读性。&lt;br&gt;
这个脚本需要&lt;code&gt;curl&lt;/code&gt;、&lt;code&gt;xml2json&lt;/code&gt;和&lt;code&gt;jq&lt;/code&gt;三个包，若系统中没有这些包，脚本会失败。&lt;br&gt;
为了使脚本可重现，我们使用以下脚本：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);font-style: italic;&quot;&gt;#!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);font-style: italic;&quot;&gt;/usr/bin/env nix-shell&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);font-style: italic;&quot;&gt;#!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);font-style: italic;&quot;&gt; nix-shell -i bash --pure&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);font-style: italic;&quot;&gt;#!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);font-style: italic;&quot;&gt; nix-shell -p bash cacert curl jq python3Packages.xmljson&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);font-style: italic;&quot;&gt;#!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#EA76CB, #F5C2E7);font-style: italic;&quot;&gt; nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/2a601aafdc5605a5133a2ca506a34a3a73377247.tar.gz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; https://github.com/NixOS/nixpkgs/releases.atom&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; xml2json&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; jq&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个脚本使用了&lt;code&gt;nix-shell&lt;/code&gt;的shebang，&lt;code&gt;-i&lt;/code&gt;指定了&lt;code&gt;bash&lt;/code&gt;为其余部分的解释器。&lt;code&gt;-p&lt;/code&gt;参数指定了需要的包其中&lt;code&gt;xml2json&lt;/code&gt;由&lt;code&gt;python3Packages.xmljson&lt;/code&gt;提供，&lt;code&gt;cacert&lt;/code&gt;使SSL身份验证正常工作。&lt;code&gt;-I&lt;/code&gt;参数指定了Nixpkgs仓库特定的提交，这一步保证了包的版本相同。&lt;br&gt;&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;第一行是标准的shebang，指定了脚本的解释器。第二行到第四行是&lt;code&gt;nix-shell&lt;/code&gt;脚本的shebang。&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&quot;sheng-ming-shi-shellhuan-jing&quot;&gt;声明式shell环境&lt;a class=&quot;zola-anchor&quot; href=&quot;#sheng-ming-shi-shellhuan-jing&quot; aria-label=&quot;Anchor link for: sheng-ming-shi-shellhuan-jing&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Ad hoc shell环境在一次性使用时比较方便，如果想要更多的自定义空间，从&lt;code&gt;shell.nix&lt;/code&gt;文件创建一个shell环境是更好的选择。&lt;br&gt;&lt;/p&gt;
&lt;div class=&quot;admonition admonition-tip&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;💡 提示&lt;/p&gt;&lt;p&gt;有点像docker里的&lt;code&gt;Dockerfile&lt;/code&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;创建一个&lt;code&gt;shell.nix&lt;/code&gt;文件，内容如下：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;let&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;  nixpkgs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span&gt; fetchTarball&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;https://github.com/NixOS/nixpkgs/tarball/nixos-24.05&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;  pkgs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; import&lt;/span&gt;&lt;span&gt; nixpkgs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt; overlays&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt;in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pkgs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt;.&lt;/span&gt;&lt;span&gt;mkShellNoCC&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;  packages&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#8839EF, #CBA6F7);&quot;&gt; with&lt;/span&gt;&lt;span&gt; pkgs&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cowsay&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    lolcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;  ]&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;  GREETING&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;Hello, Nix!&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);&quot;&gt;  shellHook&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;    echo $GREETING | cowsay | lolcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;  &amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在&lt;code&gt;shell.nix&lt;/code&gt;文件同一个目录下运行nix-shell，会根据&lt;code&gt;shell.nix&lt;/code&gt;文件创建一个shell环境，这里包含&lt;code&gt;cowsay&lt;/code&gt;和&lt;code&gt;lolcat&lt;/code&gt;两个包。&lt;br&gt;
具体的Nix语言细节将在之后的章节讲解。&lt;/p&gt;
&lt;h1 id=&quot;gu-ding-nixpkgs&quot;&gt;固定Nixpkgs&lt;a class=&quot;zola-anchor&quot; href=&quot;#gu-ding-nixpkgs&quot; aria-label=&quot;Anchor link for: gu-ding-nixpkgs&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Nix实例中有类似这样的内容：&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#4C4F69, #CDD6F4); background-color: light-dark(#EFF1F5, #1E1E2E);&quot; &gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: light-dark(#E64553, #EBA0AC);font-style: italic;&quot;&gt; pkgs&lt;/span&gt;&lt;span style=&quot;color: light-dark(#179299, #94E2D5);&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color: light-dark(#1E66F5, #89B4FA);font-style: italic;&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; (&lt;/span&gt;&lt;span&gt;fetchTarball&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;https://github.com/NixOS/nixpkgs/archive/06278c77b5d162e62df170fec307e83f1812d94b.tar.gz&lt;/span&gt;&lt;span style=&quot;color: light-dark(#40A02B, #A6E3A1);&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: light-dark(#7C7F93, #9399B2);&quot;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里直接从Github获取相应的提交，我们可以在&lt;a rel=&quot;noopener external&quot; target=&quot;_blank&quot; href=&quot;https://status.nixos.org&quot;&gt;NixOS Status&lt;/a&gt;选择提交。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>CNN（卷积神经网络）简介</title>
          <pubDate>Thu, 20 Mar 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/cnn/</link>
          <guid>https://www.microrat.com/blog/cnn/</guid>
          <description xml:base="https://www.microrat.com/blog/cnn/">&lt;p&gt;若将一张图像每一个点都输入一个神经元，这非常容易过拟合，参数也太大。一般将每个感受野（receptive field）传入神经元。&lt;/p&gt;
&lt;h1 id=&quot;juan-ji-convolution-guo-cheng&quot;&gt;卷积（Convolution）过程&lt;a class=&quot;zola-anchor&quot; href=&quot;#juan-ji-convolution-guo-cheng&quot; aria-label=&quot;Anchor link for: juan-ji-convolution-guo-cheng&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;考虑RGB三个通道，假设每个感受野的大小为$$3 \times 3$$输入一组神经元，每个感受野的步长（stride）为$$2$$，若超出了，做填充（padding）。&lt;br&gt;
对于不同感受野输入的神经元，可以共享参数，共享参数的神经元叫过滤器（filter），而这个操作就叫卷积（Convolution）。&lt;br&gt;
即使用每个过滤器在图像上进行计算，能得出一张新的图片（通道数为过滤器个数）。&lt;/p&gt;
&lt;h1 id=&quot;chi-hua-pooling-guo-cheng&quot;&gt;池化（Pooling）过程&lt;a class=&quot;zola-anchor&quot; href=&quot;#chi-hua-pooling-guo-cheng&quot; aria-label=&quot;Anchor link for: chi-hua-pooling-guo-cheng&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;池化将图片缩小，目的是通过减小输入减小参数。池化的方法有很多最简单的就是在一个神经元输出中选择一个数作为输出。（现在由于算力的增加，Pooling可以不再使用）&lt;/p&gt;
&lt;h1 id=&quot;flatten-bian-ping-guo-cheng&quot;&gt;Flatten（变平）过程&lt;a class=&quot;zola-anchor&quot; href=&quot;#flatten-bian-ping-guo-cheng&quot; aria-label=&quot;Anchor link for: flatten-bian-ping-guo-cheng&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;使用Flatten函数把输出的矩阵变为向量，然后在经过一层神经网络并归一化（Softmax）。&lt;br&gt;&lt;/p&gt;
&lt;div class=&quot;admonition admonition-note&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;ℹ️ 注意&lt;/p&gt;&lt;p&gt;一般来说，CNN不能够很好地处理缩放或旋转图片后的问题，这需要我们将训练资料做数据增强（Data Augmentation）。&lt;/p&gt;
&lt;/div&gt;
</description>
      </item>
      <item>
          <title>自注意力机制（Self-attention）简介</title>
          <pubDate>Thu, 20 Mar 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/self-attention/</link>
          <guid>https://www.microrat.com/blog/self-attention/</guid>
          <description xml:base="https://www.microrat.com/blog/self-attention/">&lt;p&gt;在处理输入为一组长短不一的向量时，会用到自注意力机制。&lt;/p&gt;
&lt;h1 id=&quot;sequence-labeling-wen-ti&quot;&gt;Sequence Labeling 问题&lt;a class=&quot;zola-anchor&quot; href=&quot;#sequence-labeling-wen-ti&quot; aria-label=&quot;Anchor link for: sequence-labeling-wen-ti&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;每个输入的向量通过全连接层得到输出即可完成，但是在输入相同内容时会出现问题（例如翻译同一个单词时，意思可能不同）。此时，将输入的向量的前后几个向量（window）也输入，能有更好的效果，但是在解决有些需要联系整个Sequence的问题时效果仍然不佳，此时引入自注意力机制（Self-attention）。&lt;br&gt;
将每个输入的向量先通过自注意力机制生成一个带有Sequence信息的向量，然后再通过全连接层得到输出，能更好地解决这些问题。&lt;/p&gt;
&lt;h2 id=&quot;zi-zhu-yi-li-ceng&quot;&gt;自注意力层&lt;a class=&quot;zola-anchor&quot; href=&quot;#zi-zhu-yi-li-ceng&quot; aria-label=&quot;Anchor link for: zi-zhu-yi-li-ceng&quot;&gt;🔗&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;对于每一个向量，计算出全部向量和其关联程度（attention score）$$\alpha$$，在将其关联程度与向量做出变换的输出的积相加，得出的向量就会靠近关联程度高的那个，这个向量就是自注意力层的输出，也就是上面所说带有Sequence信息的向量。&lt;br&gt;
具体的说，每个向量$$a_i$$乘上一个矩阵$$W_q$$得到$$q_i$$，乘上一个矩阵$$W_k$$得到$$k_i$$，乘上一个矩阵$$W_v$$得到$$v_i$$，其中$$q_i$$和$$k_j$$相乘得到相关系数$$\alpha_{ij}$$，soft-max后得到$$\alpha_{ij}^{\prime}$$，$$v^j$$与$$\alpha_{ij}^{\prime}$$相乘得到$$a_i$$的输出。&lt;br&gt;
有些时候，有多种相关性，此时就需要多头自注意力机制（Multi-head Self-attention），及上面的$$q_i,k_i,v_i$$再乘上多个矩阵得到$$q_i^n,k_i^n,v_i^n$$，再由$$q_i^n,k_i^n,v_i^n$$来计算输出。&lt;br&gt;&lt;/p&gt;
&lt;div class=&quot;admonition admonition-tip&quot;&gt;&lt;p class=&quot;admonition-title&quot;&gt;💡 位置信息&lt;/p&gt;&lt;p&gt;有时需要考虑到向量所在的位置信息，采用位置编码（Positional Encoding）。一种简单的方法是给每个位置一个表征位置的向量$$e_i$$，把$$e_i$$加到$$a_i$$就能考虑到位置信息，当然也有很多不同的方法将位置信息考虑进去。&lt;/p&gt;
&lt;/div&gt;
&lt;h1 id=&quot;self-attention-for-speech&quot;&gt;Self-attention for Speech&lt;a class=&quot;zola-anchor&quot; href=&quot;#self-attention-for-speech&quot; aria-label=&quot;Anchor link for: self-attention-for-speech&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;受运算速度限制，在处理语音问题时，我们往往不用考虑整个Sequence，而是考虑输入附近的向量做自注意力层。&lt;/p&gt;
&lt;h1 id=&quot;self-attention-for-image&quot;&gt;Self-attention for Image&lt;a class=&quot;zola-anchor&quot; href=&quot;#self-attention-for-image&quot; aria-label=&quot;Anchor link for: self-attention-for-image&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;将一张图片的每一个像素看作三维向量，一张图片也可以看作是一个Sequence来处理。&lt;br&gt;
与CNN相比，Self-attention考虑了整张图片的信息，比CNN更广，弹性更大，所以Self-attention需要更多的数据，不然容易出现过拟合问题。&lt;br&gt;
与RNN相比，RNN与离得远的向量的联系会比较低，而Self-attention可以定义相应的联系。另外RNN不能够并行处理，而Self-attention可以并行处理，所以Self-attention速度会更快。&lt;/p&gt;
&lt;h1 id=&quot;self-attention-for-graph&quot;&gt;Self-attention for Graph&lt;a class=&quot;zola-anchor&quot; href=&quot;#self-attention-for-graph&quot; aria-label=&quot;Anchor link for: self-attention-for-graph&quot;&gt;🔗&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;对一个图，每一个节点看作一个向量，节点与节点之间有边，边可以看作是向量之间的联系，所以也可以用Self-attention来处理图。处理时一般只用计算有相连的节点，不相连的节点关联性设为0，这就是一种GNN模型。&lt;/p&gt;
</description>
      </item>
      <item>
          <title>My First Post</title>
          <pubDate>Sat, 15 Mar 2025 00:00:00 +0000</pubDate>
          <author>小鼠</author>
          <link>https://www.microrat.com/blog/my-first-post/</link>
          <guid>https://www.microrat.com/blog/my-first-post/</guid>
          <description xml:base="https://www.microrat.com/blog/my-first-post/">&lt;p&gt;The purpose of this post is to test the functionality of the blog.&lt;br&gt;
Actually, it works!&lt;br&gt;
这是我的第一篇博客，用来测试博客的功能是否正常。&lt;br&gt;&lt;/p&gt;
</description>
      </item>
    </channel>
</rss>
