<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/feeds/style.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>rust-official-blog</title>
    <description>rssume processed feed for rust-official-blog</description>
    <link>/feeds/rust-official-blog</link>
    <atom:link href="/feeds/rust-official-blog" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Thu, 4 Jun 2026 10:01:12 +0000</lastBuildDate>
    <generator>rssume</generator>
    <item>
      <title>WebAssembly 目标与未定义符号处理的变更</title>
      <dc:creator>Alex Crichton</dc:creator>
      <description>[AI 摘要] Rust 将移除 WebAssembly 链接器的 `--allow-undefined` 标志，以改善错误诊断，用户需检查代码是否依赖此行为并进行修复。</description>
      <content:encoded><![CDATA[<div style="background:#f0f4f8;border-left:3px solid #3b82f6;padding:12px 16px;border-radius:6px;margin:12px 0;font-size:14px;color:#555"><strong>[AI 摘要]</strong> Rust 将移除 WebAssembly 链接器的 `--allow-undefined` 标志，以改善错误诊断，用户需检查代码是否依赖此行为并进行修复。</div><p>Rust 的 WebAssembly 目标即将发生一项变更，此变更可能破坏现有项目，本文旨在通知用户即将到来的变化、解释其内容以及处理方法。具体而言，Rust 中所有 WebAssembly 目标此前均使用 <code>--allow-undefined</code> 标志链接至 <code>wasm-ld</code>，而该标志现将被移除。</p>
<h2 id="what-is-allow-undefined"><a href="#what-is-allow-undefined" rel="noopener noreferrer"></a>
什么是 <code>--allow-undefined</code>？</h2>
<p>目前 Rust 中的 WebAssembly 二进制文件均通过 <code>wasm-ld</code> 链接生成。其作用类似于 <code>ld</code>、<code>lld</code> 和 <code>mold</code> 等工具；它接收独立编译的 crate/对象文件并生成最终的二进制文件。自 Rust 引入 WebAssembly 目标以来，<code>--allow-undefined</code> 标志一直被传递给 <code>wasm-ld</code>。该标志的文档说明如下：</p>
<pre><code><span><span>  --allow-undefined       Allow undefined symbols in linked binary. This options</span></span>
<span><span>                          is equivalent to --import-undefined and</span></span>
<span><span>                          --unresolved-symbols=ignore-all</span></span></code></pre>
<p>此处的“未定义”特指 <code>wasm-ld</code> 本身中的符号解析。符号的概念与原生平台紧密对应，例如所有 Rust 函数都有关联的符号。符号在 Rust 中可通过 <code>extern "C"</code> 块引用，例如：</p>
<pre><code><span><span>unsafe</span><span> extern</span><span> "</span><span>C</span><span>"</span><span> {</span></span>
<span><span>    fn</span><span> mylibrary_init</span><span>(</span><span>)</span><span>;</span></span>
<span><span>}</span></span>
<span></span>
<span><span>fn</span><span> init</span><span>(</span><span>)</span><span> {</span></span>
<span><span>    unsafe</span><span> {</span></span>
<span><span>        mylibrary_init</span><span>(</span><span>)</span><span>;</span></span>
<span><span>    }</span></span>
<span><span>}</span></span></code></pre>
<p>符号 <code>mylibrary_init</code> 是一个未定义符号。它通常由程序的另一个组件（如外部编译的 C 库）定义，该组件将提供此符号的定义。然而，通过向 <code>wasm-ld</code> 传递 <code>--allow-undefined</code>，上述代码将生成如下 WebAssembly 模块：</p>
<pre><code><span><span>(</span><span>module</span></span>
<span><span>    (</span><span>import</span><span> "</span><span>env</span><span>"</span><span> "</span><span>mylibrary_init</span><span>"</span><span> (</span><span>func</span><span> $mylibrary_init</span><span>))</span></span>
<span></span>
<span><span>    ;;</span><span> ...</span></span>
<span><span>)</span></span></code></pre>
<p>这意味着未定义符号被忽略，并最终作为导入符号出现在生成的 WebAssembly 模块中。</p>
<p>确切的历史细节已难考究，但目前普遍认为在 Rust 工具链中引入 <code>wasm-ld</code> 的早期阶段，<code>--allow-undefined</code> 实际上是必需的。这个历史遗留的解决方法一直沿用至今，未曾改变。</p>
<h2 id="what-s-wrong-with-allow-undefined"><a href="#what-s-wrong-with-allow-undefined" rel="noopener noreferrer"></a>
<code>--allow-undefined</code> 有何不妥？</h2>
<p>在所有 WebAssembly 目标上使用 <code>--allow-undefined</code>，使得 rustc 在 WebAssembly 与其他平台之间引入了行为差异。<code>--allow-undefined</code> 的主要风险在于，构建过程中的错误配置或失误可能导致生成损坏的 WebAssembly 模块，而非产生编译错误。这意味着问题被延迟发现，拉长了从问题引入到发现之间的距离。一些典型问题场景包括：</p>
<ul>
<li>
<p>如果将 <code>mylibrary_init</code> 误写为 <code>mylibraryinit</code>，最终二进制文件将导入 <code>mylibraryinit</code> 符号，而非调用链接的 C 符号 <code>mylibrary_init</code>。</p>
</li>
<li>
<p>如果 <code>mylibrary</code> 被错误地未编译并链接到最终应用程序中，<code>mylibrary_init</code> 符号将被导入，而不是产生“未定义”的链接器错误。</p>
</li>
<li>
<p>如果使用外部工具（如 <code>wasm-bindgen</code> 或 <code>wasm-tools component new</code>）处理 WebAssembly 模块，这些工具默认不知道如何处理 <code>"env"</code> 导入，很可能会产生某种错误信息，且该信息通常无法清晰关联到原始代码及其导入来源。</p>
</li>
<li>
<p>对于 Web 用户，如果你曾遇到类似 <code>Uncaught TypeError: Failed to resolve module specifier "env". Relative references must start with either "/", "./", or "../".</code> 的错误，这可能意味着 <code>"env"</code> 意外泄漏到最终模块中，而真正的错误是未定义符号错误，而非缺少提供的 <code>"env"</code> 项。</p>
</li>
</ul>
<p>所有原生平台默认将未定义符号视为错误，因此通过使用 <code>--allow-undefined</code>，rustc 在 WebAssembly 目标上引入了令人意外的行为。此次变更的目标正是移除这种意外，使其行为更接近原生平台。</p>
<h2 id="what-is-going-to-break-and-how-to-fix"><a href="#what-is-going-to-break-and-how-to-fix" rel="noopener noreferrer"></a>
哪些内容会中断，以及如何修复？</h2>
<p>理论上，此变更不会导致大量中断。如果最终的 WebAssembly 二进制文件导入了意外符号，那么该二进制文件很可能无法在所需的嵌入环境中运行，因为所需的嵌入环境可能未提供该符号的定义。例如，如果你为 <code>wasm32-wasip1</code> 编译应用程序，最终二进制文件导入 <code>mylibrary_init</code> 将导致在大多数运行时中失败运行，因为它被视为未解析的导入。这意味着在大多数情况下，此变更不会破坏用户，而是会提供更好的诊断信息。</p>
<p>然而，本文的原因在于用户可能有意依赖此行为。例如，你的应用程序可能包含：</p>
<pre><code><span><span>unsafe</span><span> extern</span><span> "</span><span>C</span><span>"</span><span> {</span></span>
<span><span>    fn</span><span> js_log</span><span>(</span><span>n</span><span>:</span><span> u32</span><span>)</span><span>;</span></span>
<span><span>}</span></span>
<span></span>
<span><span>//</span><span> ...</span></span></code></pre>
<p>然后可能是一些如下所示的 JavaScript 代码：</p>
<pre><code><span><span>let</span><span> instance</span><span> =</span><span> await</span><span> WebAssembly</span><span>.</span><span>instantiate</span><span>(</span><span>module</span><span>,</span><span> {</span></span>
<span><span>    env</span><span>:</span><span> {</span></span>
<span><span>        js_log</span><span>:</span><span> n</span><span> =&gt;</span><span> console</span><span>.</span><span>log</span><span>(</span><span>n</span><span>)</span><span>,</span></span>
<span><span>    }</span></span>
<span><span>}</span><span>)</span><span>;</span></span></code></pre>
<p>实际上，用户可能明确依赖 <code>--allow-undefined</code> 在最终 WebAssembly 二进制文件中生成导入的行为。</p>
<p>如果遇到这种情况，可以通过 <code>#[link]</code> 属性显式指定 <code>wasm_import_module</code> 名称来修复代码：</p>
<pre><code><span><span>#</span><span>[</span><span>link</span><span>(</span><span>wasm_import_module </span><span>=</span><span> "</span><span>env</span><span>"</span><span>)</span><span>]</span></span>
<span><span>unsafe</span><span> extern</span><span> "</span><span>C</span><span>"</span><span> {</span></span>
<span><span>    fn</span><span> js_log</span><span>(</span><span>n</span><span>:</span><span> u32</span><span>)</span><span>;</span></span>
<span><span>}</span></span>
<span></span>
<span><span>//</span><span> ...</span></span></code></pre>
<p>这将保持与之前相同的行为，并且将不再被视为 <code>wasm-ld</code> 的未定义符号，并且在此次变更前后均可正常工作。</p>
<p>受影响的用户也可以使用 <code>-Clink-arg=--allow-undefined</code> 进行编译，以快速恢复旧行为。</p>
<h2 id="when-is-this-change-being-made"><a href="#when-is-this-change-being-made" rel="noopener noreferrer"></a>
此变更何时生效？</h2>
<p>移除 wasm 目标上的 <code>--allow-undefined</code> 正在通过 <a href="https://github.com/rust-lang/rust/pull/149868" rel="noopener noreferrer">rust-lang/rust#149868</a> 进行。该变更计划不久后进入 nightly 版本，并将随 Rust 1.96 于 2026-05-28 发布。如果你因此次变更引发任何问题，请随时在 <a href="https://github.com/rust-lang/rust" rel="noopener noreferrer">rust-lang/rust</a> 上提交 issue。</p><p><em>由 mimo-v2.5 模型翻译，花费 7395 tokens</em></p>]]></content:encoded>
      <link>https://blog.rust-lang.org/2026/04/04/changes-to-webassembly-targets-and-handling-undefined-symbols/</link>
      <guid isPermaLink="false">https://blog.rust-lang.org/2026/04/04/changes-to-webassembly-targets-and-handling-undefined-symbols/</guid>
      <pubDate>Sat, 4 Apr 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>docs.rs：默认情况下构建更少的目标</title>
      <dc:creator>Denis Cornehl</dc:creator>
      <description>[AI 摘要] docs.rs将于2026年将默认构建目标从五个减少到一个，以优化构建资源。</description>
      <content:encoded><![CDATA[<div style="background:#f0f4f8;border-left:3px solid #3b82f6;padding:12px 16px;border-radius:6px;margin:12px 0;font-size:14px;color:#555"><strong>[AI 摘要]</strong> docs.rs将于2026年将默认构建目标从五个减少到一个，以优化构建资源。</div><h1 id="building-fewer-targets-by-default"><a href="#building-fewer-targets-by-default" rel="noopener noreferrer"></a>
默认情况下构建更少的目标</h1>
<p>在<strong>2026年5月1日</strong>，docs.rs将对其构建行为进行一项<strong>破坏性</strong>变更。</p>
<p>目前，如果一个crate的<a href="https://docs.rs/about/metadata" rel="noopener noreferrer">docs.rs元数据</a>中没有定义<code>targets</code>列表，docs.rs将为默认的五个目标构建文档。</p>
<p>从<strong>2026年5月1日</strong>开始，docs.rs将只为默认目标构建文档，除非明确请求其他目标。</p>
<p>这是我们自2020年引入的一项变更中的下一步，当时docs.rs添加了选择更少构建目标的支持。大多数crate不会为不同目标编译不同的代码，因此默认构建更少的目标更适合大多数发布。这也可以减少构建时间并节省docs.rs的资源。</p>
<p>此变更仅影响：</p>
<ol>
<li>新发布</li>
<li>旧发布的重新构建</li>
</ol>
<h2 id="how-is-the-default-target-chosen"><a href="#how-is-the-default-target-chosen" rel="noopener noreferrer"></a>
默认目标如何选择？</h2>
<p>如果你没有设置<code>default-target</code>，docs.rs将使用其构建服务器的目标：<code>x86_64-unknown-linux-gnu</code>。</p>
<p>你可以通过在<a href="https://docs.rs/about/metadata" rel="noopener noreferrer">docs.rs元数据</a>中设置<code>default-target</code>来覆盖它：</p>
<pre><code><span><span>[</span><span>package</span><span>.</span><span>metadata</span><span>.</span><span>docs</span><span>.</span><span>rs</span><span>]</span></span>
<span><span>default-target</span><span> =</span><span> "</span><span>x86_64-apple-darwin</span><span>"</span></span></code></pre><h2 id="how-do-i-build-documentation-for-additional-targets"><a href="#how-do-i-build-documentation-for-additional-targets" rel="noopener noreferrer"></a>
我如何为额外的目标构建文档？</h2>
<p>如果你的crate需要为默认目标以外的目标构建文档，请在<code>Cargo.toml</code>中明确完整定义列表：</p>
<pre><code><span><span>[</span><span>package</span><span>.</span><span>metadata</span><span>.</span><span>docs</span><span>.</span><span>rs</span><span>]</span></span>
<span><span>targets</span><span> =</span><span> [</span></span>
<span><span>    "</span><span>x86_64-unknown-linux-gnu</span><span>"</span><span>,</span></span>
<span><span>    "</span><span>x86_64-apple-darwin</span><span>"</span><span>,</span></span>
<span><span>    "</span><span>x86_64-pc-windows-msvc</span><span>"</span><span>,</span></span>
<span><span>    "</span><span>i686-unknown-linux-gnu</span><span>"</span><span>,</span></span>
<span><span>    "</span><span>i686-pc-windows-msvc</span><span>"</span></span>
<span><span>]</span></span></code></pre>
<p>设置<code>targets</code>后，docs.rs将仅为这些目标构建文档。</p>
<p>docs.rs仍然支持Rust工具链中可用的任何目标。只有默认行为正在改变。</p><p><em>由 mimo-v2.5 模型翻译，花费 2858 tokens</em></p>]]></content:encoded>
      <link>https://blog.rust-lang.org/2026/04/04/docsrs-only-default-targets/</link>
      <guid isPermaLink="false">https://blog.rust-lang.org/2026/04/04/docsrs-only-default-targets/</guid>
      <pubDate>Sat, 4 Apr 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Rust 1.95.0 发布公告</title>
      <dc:creator>The Rust Release Team</dc:creator>
      <description>[AI 摘要] Rust 1.95.0 发布，引入了 cfg_select! 宏和匹配表达式中的 if-let 守卫等新功能。</description>
      <content:encoded><![CDATA[<div style="background:#f0f4f8;border-left:3px solid #3b82f6;padding:12px 16px;border-radius:6px;margin:12px 0;font-size:14px;color:#555"><strong>[AI 摘要]</strong> Rust 1.95.0 发布，引入了 cfg_select! 宏和匹配表达式中的 if-let 守卫等新功能。</div><p>Rust 团队很高兴地宣布推出新版本的 Rust，1.95.0。Rust 是一种赋能每个人构建可靠、高效软件的编程语言。</p>
<p>如果你已经通过 <code>rustup</code> 安装了先前版本的 Rust，你可以通过以下方式获取 1.95.0：</p>
<pre><code><span><span>$</span><span> rustup update stable</span></span></code></pre>
<p>如果你尚未安装，可以从我们网站的相关页面<a href="https://www.rust-lang.org/install.html" rel="noopener noreferrer">获取 <code>rustup</code></a>，并查看 <a href="https://doc.rust-lang.org/stable/releases.html#version-1950-2026-04-16" rel="noopener noreferrer">1.95.0 的详细发布说明</a>。</p>
<p>如果你想通过测试未来的版本来帮助我们，你可以考虑在本地更新以使用 beta 频道（<code>rustup default beta</code>）或 nightly 频道（<code>rustup default nightly</code>）。请<a href="https://github.com/rust-lang/rust/issues/new/choose" rel="noopener noreferrer">报告</a>你可能遇到的任何错误！</p>
<h2 id="what-s-in-1-95-0-stable"><a href="#what-s-in-1-95-0-stable" rel="noopener noreferrer"></a>
1.95.0 稳定版包含哪些内容</h2>
<h3 id="cfg-select"><a href="#cfg-select" rel="noopener noreferrer"></a>
<code>cfg_select!</code></h3>
<p>Rust 1.95 引入了
<a href="https://doc.rust-lang.org/stable/std/macro.cfg_select.html" rel="noopener noreferrer"><code>cfg_select!</code></a>
宏，其作用大致类似于在 <code>cfg</code> 上进行编译时的 <code>match</code>。这
与流行的
<a href="https://crates.io/crates/cfg-if" rel="noopener noreferrer"><code>cfg-if</code></a>
crate 实现了相同的目的，尽管语法不同。<code>cfg_select!</code> 会展开为第一个配置谓词求值结果为 <code>true</code> 的分支的右侧部分。一些示例：</p>
<pre><code><span><span>cfg_select!</span><span> {</span></span>
<span><span>    unix</span><span> =&gt;</span><span> {</span></span>
<span><span>        fn</span><span> foo</span><span>(</span><span>)</span><span> {</span><span> /*</span><span> unix 特定功能 </span><span>*/</span><span> }</span></span>
<span><span>    }</span></span>
<span><span>    target_pointer_width</span><span> =</span><span> "</span><span>32</span><span>"</span><span> =&gt;</span><span> {</span></span>
<span><span>        fn</span><span> foo</span><span>(</span><span>)</span><span> {</span><span> /*</span><span> 非 unix、32 位功能 </span><span>*/</span><span> }</span></span>
<span><span>    }</span></span>
<span><span>    _</span><span> =&gt;</span><span> {</span></span>
<span><span>        fn</span><span> foo</span><span>(</span><span>)</span><span> {</span><span> /*</span><span> 回退实现 </span><span>*/</span><span> }</span></span>
<span><span>    }</span></span>
<span><span>}</span></span>
<span></span>
<span><span>let</span><span> is_windows_str</span><span> =</span><span> cfg_select!</span><span> {</span></span>
<span><span>    windows</span><span> =&gt;</span><span> "</span><span>windows</span><span>"</span><span>,</span></span>
<span><span>    _</span><span> =&gt;</span><span> "</span><span>非 windows</span><span>"</span><span>,</span></span>
<span><span>}</span><span>;</span></span></code></pre><h3 id="if-let-guards-in-matches"><a href="#if-let-guards-in-matches" rel="noopener noreferrer"></a>
匹配表达式中的 if-let 守卫</h3>
<p>Rust 1.88 稳定了 <a href="https://blog.rust-lang.org/2025/06/26/Rust-1.88.0/#let-chains" rel="noopener noreferrer">let 链</a>。Rust
1.95 将该能力引入到 match 表达式中，允许基于模式匹配进行条件判断。</p>
<pre><code><span><span>match</span><span> value</span><span> {</span></span>
<span><span>Some</span><span>(</span><span>x</span><span>)</span><span> if</span><span> let</span><span> Ok</span><span>(</span><span>y</span><span>)</span><span> =</span><span> compute</span><span>(</span><span>x</span><span>)</span><span> =&gt;</span><span> {</span></span>
<span><span>        //</span><span> `x` 和 `y` 都可以在这里使用</span></span>
<span><span>        println!</span><span>(</span><span>"</span><span>{</span><span>}</span><span>, </span><span>{</span><span>}</span><span>"</span><span>,</span><span> x</span><span>,</span><span> y</span><span>)</span><span>;</span></span>
<span><span>    }</span></span>
<span><span>_</span><span> =&gt;</span><span> {</span><span>}</span></span>
<span><span>}</span></span></code></pre>
<p>请注意，目前编译器不会将 <code>if let</code> 守卫中匹配的模式视为整个匹配详尽性评估的一部分，这与 <code>if</code> 守卫的行为一致。</p>
<h3 id="stabilized-apis"><a href="#stabilized-apis" rel="noopener noreferrer"></a>
已稳定的 API</h3>
<ul>
<li><a href="https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-From%3C%5BMaybeUninit%3CT%3E;+N%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E" rel="noopener noreferrer"><code>MaybeUninit&lt;[T; N]&gt;: From&lt;[MaybeUninit&lt;T&gt;; N]&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-AsRef%3C%5BMaybeUninit%3CT%3E;+N%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E" rel="noopener noreferrer"><code>MaybeUninit&lt;[T; N]&gt;: AsRef&lt;[MaybeUninit&lt;T&gt;; N]&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-AsRef%3C%5BMaybeUninit%3CT%3E%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E" rel="noopener noreferrer"><code>MaybeUninit&lt;[T; N]&gt;: AsRef&lt;[MaybeUninit&lt;T&gt;]&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-AsMut%3C%5BMaybeUninit%3CT%3E;+N%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E" rel="noopener noreferrer"><code>MaybeUninit&lt;[T; N]&gt;: AsMut&lt;[MaybeUninit&lt;T&gt;; N]&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-AsMut%3C%5BMaybeUninit%3CT%3E%5D%3E-for-MaybeUninit%3C%5BT;+N%5D%3E" rel="noopener noreferrer"><code>MaybeUninit&lt;[T; N]&gt;: AsMut&lt;[MaybeUninit&lt;T&gt;]&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#impl-From%3CMaybeUninit%3C%5BT;+N%5D%3E%3E-for-%5BMaybeUninit%3CT%3E;+N%5D" rel="noopener noreferrer"><code>[MaybeUninit&lt;T&gt;; N]: From&lt;MaybeUninit&lt;[T; N]&gt;&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/cell/struct.Cell.html#impl-AsRef%3C%5BCell%3CT%3E;+N%5D%3E-for-Cell%3C%5BT;+N%5D%3E" rel="noopener noreferrer"><code>Cell&lt;[T; N]&gt;: AsRef&lt;[Cell&lt;T&gt;; N]&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/cell/struct.Cell.html#impl-AsRef%3C%5BCell%3CT%3E%5D%3E-for-Cell%3C%5BT;+N%5D%3E" rel="noopener noreferrer"><code>Cell&lt;[T; N]&gt;: AsRef&lt;[Cell&lt;T&gt;]&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/cell/struct.Cell.html#impl-AsRef%3C%5BCell%3CT%3E%5D%3E-for-Cell%3C%5BT%5D%3E" rel="noopener noreferrer"><code>Cell&lt;[T]&gt;: AsRef&lt;[Cell&lt;T&gt;]&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.bool.html#impl-TryFrom%3Cu128%3E-for-bool" rel="noopener noreferrer"><code>bool: TryFrom&lt;{integer}&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.update" rel="noopener noreferrer"><code>AtomicPtr::update</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicPtr.html#method.try_update" rel="noopener noreferrer"><code>AtomicPtr::try_update</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicBool.html#method.update" rel="noopener noreferrer"><code>AtomicBool::update</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicBool.html#method.try_update" rel="noopener noreferrer"><code>AtomicBool::try_update</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicIsize.html#method.update" rel="noopener noreferrer"><code>AtomicIn::update</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicIsize.html#method.try_update" rel="noopener noreferrer"><code>AtomicIn::try_update</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicUsize.html#method.update" rel="noopener noreferrer"><code>AtomicUn::update</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/sync/atomic/struct.AtomicUsize.html#method.try_update" rel="noopener noreferrer"><code>AtomicUn::try_update</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/macro.cfg_select.html" rel="noopener noreferrer"><code>cfg_select!</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/index.html" rel="noopener noreferrer"><code>mod core::range</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeInclusive.html" rel="noopener noreferrer"><code>core::range::RangeInclusive</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeInclusiveIter.html" rel="noopener noreferrer"><code>core::range::RangeInclusiveIter</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/hint/fn.cold_path.html" rel="noopener noreferrer"><code>core::hint::cold_path</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_ref_unchecked" rel="noopener noreferrer"><code>&lt;*const T&gt;::as_ref_unchecked</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_ref_unchecked-1" rel="noopener noreferrer"><code>&lt;*mut T&gt;::as_ref_unchecked</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/primitive.pointer.html#method.as_mut_unchecked" rel="noopener noreferrer"><code>&lt;*mut T&gt;::as_mut_unchecked</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.push_mut" rel="noopener noreferrer"><code>Vec::push_mut</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.insert_mut" rel="noopener noreferrer"><code>Vec::insert_mut</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.push_front_mut" rel="noopener noreferrer"><code>VecDeque::push_front_mut</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.push_back_mut" rel="noopener noreferrer"><code>VecDeque::push_back_mut</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.insert_mut" rel="noopener noreferrer"><code>VecDeque::insert_mut</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/collections/struct.LinkedList.html#method.push_front_mut" rel="noopener noreferrer"><code>LinkedList::push_front_mut</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/collections/struct.LinkedList.html#method.push_back_mut" rel="noopener noreferrer"><code>LinkedList::push_back_mut</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.dangling_ptr" rel="noopener noreferrer"><code>Layout::dangling_ptr</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.repeat" rel="noopener noreferrer"><code>Layout::repeat</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.repeat_packed" rel="noopener noreferrer"><code>Layout::repeat_packed</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.extend_packed" rel="noopener noreferrer"><code>Layout::extend_packed</code></a></li>
</ul>
<p>以下之前已稳定的 API 现在在 const 上下文中也已稳定：</p>
<ul>
<li><a href="https://doc.rust-lang.org/stable/std/fmt/fn.from_fn.html" rel="noopener noreferrer"><code>fmt::from_fn</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/ops/enum.ControlFlow.html#method.is_break" rel="noopener noreferrer"><code>ControlFlow::is_break</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/ops/enum.ControlFlow.html#method.is_continue" rel="noopener noreferrer"><code>ControlFlow::is_continue</code></a></li>
</ul>
<h3 id="destabilized-json-target-specs"><a href="#destabilized-json-target-specs" rel="noopener noreferrer"></a>
取消 JSON 目标规范的稳定支持</h3>
<p>Rust 1.95 在稳定版中移除了向 <code>rustc</code> 传递自定义目标规范的支持。这应该<strong>不会</strong>影响任何使用完全稳定工具链的 Rust 用户，因为构建标准库（包括仅 <code>core</code>）已经需要使用仅限 nightly 的特性。</p>
<p>我们也在 <a href="https://github.com/rust-lang/rust/issues/151528" rel="noopener noreferrer">跟踪问题</a>上收集自定义目标的用例，同时我们也在考虑是否应该最终以某种形式稳定此特性。</p>
<h3 id="other-changes"><a href="#other-changes" rel="noopener noreferrer"></a>
其他变更</h3>
<p>请查看 <a href="https://github.com/rust-lang/rust/releases/tag/1.95.0" rel="noopener noreferrer">Rust</a>、<a href="https://doc.rust-lang.org/nightly/cargo/CHANGELOG.html#cargo-195-2026-04-16" rel="noopener noreferrer">Cargo</a> 和 <a href="https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-195" rel="noopener noreferrer">Clippy</a> 的所有变更。</p>
<h2 id="contributors-to-1-95-0"><a href="#contributors-to-1-95-0" rel="noopener noreferrer"></a>
1.95.0 的贡献者们</h2>
<p>许多人共同参与创建了 Rust 1.95.0。没有你们所有人，我们无法完成它。<a href="https://thanks.rust-lang.org/rust/1.95.0/" rel="noopener noreferrer">谢谢！</a></p><p><em>由 mimo-v2.5 模型翻译，花费 10536 tokens</em></p>]]></content:encoded>
      <link>https://blog.rust-lang.org/2026/04/16/Rust-1.95.0/</link>
      <guid isPermaLink="false">https://blog.rust-lang.org/2026/04/16/Rust-1.95.0/</guid>
      <pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>宣布Google Summer of Code 2026入选项目</title>
      <dc:creator>Jakub Beránek</dc:creator>
      <description>[AI 摘要] Google在2026年夏季编程计划（GSoC）中接受了13个由Rust项目提交的提案。</description>
      <content:encoded><![CDATA[<div style="background:#f0f4f8;border-left:3px solid #3b82f6;padding:12px 16px;border-radius:6px;margin:12px 0;font-size:14px;color:#555"><strong>[AI 摘要]</strong> Google在2026年夏季编程计划（GSoC）中接受了13个由Rust项目提交的提案。</div><p>正如<a href="https://blog.rust-lang.org/2026/02/19/Rust-participates-in-GSoC-2026/" rel="noopener noreferrer">先前所宣布</a>的，Rust项目将参加<a href="https://summerofcode.withgoogle.com" rel="noopener noreferrer">Google Summer of Code (GSoC)</a> 2026。GSoC是由Google组织的一项全球性计划，旨在为开源世界引入新的贡献者。</p>
<p>几个月前，我们发布了一份<a href="https://github.com/rust-lang/google-summer-of-code" rel="noopener noreferrer">GSoC项目创意</a>列表，并开始在我们的<a href="https://rust-lang.zulipchat.com/#narrow/stream/421156-gsoc" rel="noopener noreferrer">Zulip</a>频道上与潜在的GSoC申请者讨论这些项目。我们与潜在贡献者进行了许多有趣的讨论，甚至看到其中一些人在GSoC正式开始之前就对各种Rust项目仓库做出了重要的贡献！</p>
<p>申请者在3月底前准备并提交了他们的项目提案。今年，我们收到了96份提案，比去年增加了50%。我们很高兴再次有这么多人对我们的项目感兴趣！与今年许多其他GSoC组织一样，我们在处理一些AI生成的提案和使用AI代理生成的低质量贡献时有些挣扎，但这还在可控范围内。</p>
<p>GSoC要求我们提供一份按优先级排序的最佳提案列表，这总是具有挑战性的，因为Rust是一个拥有众多优先事项的大型项目。我们的导师审查了提交的提案，并根据他们与特定申请者之前的互动、其目前的贡献、提案本身的质量，以及所提项目对Rust项目及其更广泛社区的重要性进行了评估。我们还必须考虑导师的时间和可用性。不幸的是，由于过去几周有几位导师失去了Rust工作的资助，我们不得不取消一些项目。</p>
<p>与GSoC通常的情况一样，即使一些项目主题收到了多份提案<sup id="fr-most-popular-1"><a href="#fn-most-popular" rel="noopener noreferrer">1</a></sup>，我们也只能为每个项目主题选择一份提案。我们还必须在针对不同工作的提案之间做出选择，以避免让单个导师因承担多个项目而不堪重负。最终，我们将列表缩减至那些我们现有的导师团队仍然能够实际支持的最佳提案。我们提交了这份名单，并热切地等待着其中有多少提案能被GSoC接受。</p>
<h2 id="selected-projects"><a href="#selected-projects" rel="noopener noreferrer"></a>
入选项目
</h2>
<p>4月30日，Google公布了入选的项目。我们很高兴地分享，Google为Google Summer of Code 2026接受了<strong>13</strong>个Rust项目的提案。这是很多项目！我们对GSoC 2026感到非常高兴和兴奋！</p>
<p>以下是入选提案的列表（按字母顺序排列），包括其作者和指定的导师：</p>
<ul>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/eF3fkjrN" rel="noopener noreferrer">为Rust实现安全GPU卸载的前端</a></strong>，由<a href="https://github.com/sa4dus" rel="noopener noreferrer">Marcelo Domínguez</a>提交，导师为<a href="https://github.com/ZuseZ4" rel="noopener noreferrer">Manuel Drehwald</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/Fx0vHvcq" rel="noopener noreferrer">为Wild添加WebAssembly链接支持</a></strong>，由<a href="https://github.com/lapla-cogito" rel="noopener noreferrer">Kei Akiyama</a>提交，导师为<a href="https://github.com/davidlattimore" rel="noopener noreferrer">David Lattimore</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/Wg1mCCHL" rel="noopener noreferrer">将自动微分和卸载引入Rust CI</a></strong>，由<a href="https://github.com/sgasho" rel="noopener noreferrer">Shota Sugano</a>提交，导师为<a href="https://github.com/ZuseZ4" rel="noopener noreferrer">Manuel Drehwald</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/TBpqK07H" rel="noopener noreferrer">为Miri实现调试器</a></strong>，由<a href="https://github.com/moabo3li" rel="noopener noreferrer">Mohamed Ali Mohamed</a>提交，导师为<a href="https://github.com/oli-obk" rel="noopener noreferrer">Oli Scherer</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/xFrskRCv" rel="noopener noreferrer">实现impl和mut限制</a></strong>，由<a href="https://github.com/CoCo-Japan-pan" rel="noopener noreferrer">Ryosuke Yamano</a>提交，导师为<a href="https://github.com/jhpratt" rel="noopener noreferrer">Jacob Pratt</a>和<a href="https://github.com/Urgau" rel="noopener noreferrer">Urgau</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/g4xMTT5l" rel="noopener noreferrer">改善serialport-rs的易用性和安全性</a></strong>，由<a href="https://github.com/NONnonHere" rel="noopener noreferrer">Tanmay</a>提交，导师为<a href="https://github.com/sirhcel" rel="noopener noreferrer">Christian Meusel</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/AObylxqh" rel="noopener noreferrer">libc：过渡不同位宽的时间和偏移变体，并弃用易出错的常量</a></strong>，由<a href="https://github.com/dybucc" rel="noopener noreferrer">Adam Martinez</a>提交，导师为<a href="https://github.com/tgross35" rel="noopener noreferrer">Trevor Gross</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/svblODn5" rel="noopener noreferrer">使用Wild链接Linux内核及其模块</a></strong>，由<a href="https://github.com/vishruth-thimmaiah" rel="noopener noreferrer">Vishruth Thimmaiah</a>提交，导师为<a href="https://github.com/davidlattimore" rel="noopener noreferrer">David Lattimore</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/lif4YQOE" rel="noopener noreferrer">将rust-analyzer辅助功能迁移到SyntaxEditor</a></strong>，由<a href="https://github.com/Shourya742" rel="noopener noreferrer">Shourya Sharma</a>提交，导师为<a href="https://github.com/ChayimFriedman2" rel="noopener noreferrer">Chayim Refael Friedman</a>和<a href="https://github.com/Veykril" rel="noopener noreferrer">Lukas Wirth</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/Aak8J6RB" rel="noopener noreferrer">将std::arch测试套件移植到rust-lang/rust</a></strong>，由<a href="https://github.com/xonx4l" rel="noopener noreferrer">Sumit Kumar</a>提交，导师为<a href="https://github.com/Kobzol" rel="noopener noreferrer">Jakub Beránek</a>和<a href="https://github.com/folkertdev" rel="noopener noreferrer">Folkert de Vries</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/l4jlMDP9" rel="noopener noreferrer">重组tests/ui/issues</a></strong>，由<a href="https://github.com/zedddie" rel="noopener noreferrer">zedddie</a>提交，导师为<a href="https://github.com/Teapot4195" rel="noopener noreferrer">Teapot</a>和<a href="https://github.com/Kivooeo" rel="noopener noreferrer">Kivooeo</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/gzkF5BG0" rel="noopener noreferrer">利用调试器API改进调试信息测试的准确性和错误报告</a></strong>，由<a href="https://github.com/Walnut356" rel="noopener noreferrer">Anthony Bolden</a>提交，导师为<a href="https://github.com/Kobzol" rel="noopener noreferrer">Jakub Beránek</a>和<a href="https://github.com/jieyouxu" rel="noopener noreferrer">Jieyou Xu</a></li>
<li><strong><a href="https://summerofcode.withgoogle.com/programs/2026/projects/jP7dTlN6" rel="noopener noreferrer">为rustup提供XDG路径支持</a></strong>，由<a href="https://github.com/Cloud0310" rel="noopener noreferrer">Guicheng Liu</a>提交，导师为<a href="https://github.com/rami3l" rel="noopener noreferrer">rami3l</a></li>
</ul>
<p><strong>祝贺所有提案被选中的申请者！</strong>我们的导师期待与你们合作，共同推进这些令人兴奋的项目，以改善Rust生态系统。你们应该很快就会收到我们的消息，以便我们开始协调你们的GSoC项目工作。</p>
<p>我们很高兴能指导三位去年已经与我们合作过GSoC的贡献者。欢迎回来，Kei、Marcelo和Shourya！</p>
<p>我们要感谢所有提案未被接受的申请者，感谢你们与Rust社区的互动以及对各种Rust项目的贡献。有一些很棒的提案未能入选，很大程度上是因为导师资源有限。然而，即使你的提案未被接受，如果你愿意在GSoC之外继续为你感兴趣的项目做出贡献，我们会非常高兴！我们的<a href="https://github.com/rust-lang/google-summer-of-code" rel="noopener noreferrer">项目创意列表</a>仍然有效，可以作为希望参与有助于Rust项目和Rust生态系统项目的贡献者的通用入口点。一些<a href="https://rust-lang.github.io/rust-project-goals/2026/goals.html" rel="noopener noreferrer">Rust项目目标</a>也正在寻求帮助。</p>
<p>很有可能我们明年还会参加GSoC（尽管目前还不能保证），所以我们希望将来能再次收到你们的提案！</p>
<p>入选的GSoC项目将持续数月。在2026年GSoC结束后（2026年秋季），我们将发布一篇博文，总结入选项目的成果。</p>

<ol>
<li id="fn-most-popular">
<p>最受欢迎的项目主题收到了十四份不同的提案！<a href="#fr-most-popular-1" rel="noopener noreferrer">↩</a></p>
</li>
</ol>
<p><em>由 mimo-v2.5 模型翻译，花费 5581 tokens</em></p>]]></content:encoded>
      <link>https://blog.rust-lang.org/2026/04/30/gsoc-2026-selected-projects/</link>
      <guid isPermaLink="false">https://blog.rust-lang.org/2026/04/30/gsoc-2026-selected-projects/</guid>
      <pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>提升 `nvptx64-nvidia-cuda` 目标的基线要求</title>
      <dc:creator>Kjetil Kjeka</dc:creator>
      <description>[AI 摘要] Rust 1.97 将提高 `nvptx64-nvidia-cuda` 目标支持的最低 PTX ISA 和 GPU 架构版本，从而影响与旧硬件及驱动程序的兼容性。</description>
      <content:encoded><![CDATA[<div style="background:#f0f4f8;border-left:3px solid #3b82f6;padding:12px 16px;border-radius:6px;margin:12px 0;font-size:14px;color:#555"><strong>[AI 摘要]</strong> Rust 1.97 将提高 `nvptx64-nvidia-cuda` 目标支持的最低 PTX ISA 和 GPU 架构版本，从而影响与旧硬件及驱动程序的兼容性。</div><p><code>nvptx64-nvidia-cuda</code> 编译目标用于 NVIDIA GPU。使用此目标时，最终输出为 <a href="https://docs.nvidia.com/cuda/parallel-thread-execution/index.html" rel="noopener noreferrer">PTX</a>。两种版本选择决定了该输出：</p>
<ul>
<li>GPU 架构（例如 <code>sm_70</code>、<code>sm_80</code> 等），它决定了哪些 GPU 可以运行 PTX，以及</li>
<li>PTX ISA 版本，它决定了哪些 CUDA 驱动程序版本可以加载（并即时编译）PTX。</li>
</ul>
<p>在 Rust 1.97（计划于 2026 年 7 月 9 日发布）中，<code>nvptx64-nvidia-cuda</code> 的基准 PTX ISA 版本和 GPU 架构将会<a href="https://github.com/rust-lang/compiler-team/issues/965" rel="noopener noreferrer">提高</a>。这些更改影响了 Rust 编译器（<code>rustc</code>）及相关主机工具，并且使得无法生成与旧版 GPU 和旧版 CUDA 驱动程序兼容的 PTX 产物。</p>
<p>新的最低支持版本将是：</p>
<ul>
<li><strong>PTX ISA 7.0</strong>（需要 CUDA 11 或更高版本的驱动程序）</li>
<li><strong>SM 7.0</strong>（计算能力低于 7.0 的 GPU 不再受支持）</li>
</ul>
<h2 id="why-are-the-requirements-being-changed"><a href="#why-are-the-requirements-being-changed" rel="noopener noreferrer"></a>
为何更改要求？</h2>
<p>在此之前，Rust 一直支持为广泛的 GPU 架构和 PTX ISA 版本生成 PTX。实际上，存在一些缺陷可能导致有效的 Rust 代码引发编译器崩溃或错误编译。提高基线要求可以解决这些问题，并为剩余受支持的硬件提供更完善的支持。</p>
<p>移除支持会影响使用被移除架构的用户。在这种情况下，最近受影响的 GPU 架构可追溯至 2017 年，并且已不再受到 NVIDIA 的积极支持。因此，我们预计这一变更的整体影响有限。</p>
<p>维护对这些架构的支持需要大量投入。这些移除使我们能够集中开发精力，改善当前受支持硬件的正确性和性能。</p>
<h2 id="what-happens-when-i-update-to-rust-1-97"><a href="#what-happens-when-i-update-to-rust-1-97" rel="noopener noreferrer"></a>
升级到 Rust 1.97 后会发生什么？</h2>
<p>如果您需要目标 CUDA 驱动程序不支持 PTX ISA 7.0（即 CUDA 10 时代及更早的驱动程序），Rust 1.97 将无法再生成与该环境兼容的 PTX。同样，如果您需要在计算能力低于 7.0 的 GPU（例如 Maxwell 或 Pascal）上运行，Rust 1.97 也将无法为这些 GPU 生成兼容的 PTX。</p>
<p>假设您的目标是与 CUDA 11 或更高版本兼容的 CUDA 驱动程序，并使用计算能力 7.0 或更高的 GPU：</p>
<ul>
<li>如果您<strong>未</strong>指定 <code>-C target-cpu</code>，新的默认值将是 <code>sm_70</code>，您的构建应继续正常工作（但将不再兼容 Volta 之前的 GPU）。</li>
<li>如果您当前指定了较旧的 <code>-C target-cpu</code>（例如 <code>sm_60</code>），您需要要么：
<ul>
<li>移除该标志，让其默认为 <code>sm_70</code>，要么</li>
<li>将其更新为 <code>sm_70</code> 或更新的架构。</li>
</ul>
</li>
<li>如果您已经指定了 <code>-C target-cpu=sm_70</code>（或更新），此次更新不应带来行为变化。</li>
</ul>
<p>有关构建和配置 <code>nvptx64-nvidia-cuda</code> 的更多详细信息，请参阅<a href="https://doc.rust-lang.org/rustc/platform-support/nvptx64-nvidia-cuda.html" rel="noopener noreferrer">平台支持文档</a>。</p><p><em>由 mimo-v2.5 模型翻译，花费 2634 tokens</em></p>]]></content:encoded>
      <link>https://blog.rust-lang.org/2026/05/01/nvptx-baseline-update/</link>
      <guid isPermaLink="false">https://blog.rust-lang.org/2026/05/01/nvptx-baseline-update/</guid>
      <pubDate>Fri, 1 May 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Rust 项目参与 Outreachy 计划</title>
      <dc:creator>Jack Huey</dc:creator>
      <description>[AI 摘要] Rust 项目宣布参与 Outreachy 计划，并选定四个开源指导项目。</description>
      <content:encoded><![CDATA[<div style="background:#f0f4f8;border-left:3px solid #3b82f6;padding:12px 16px;border-radius:6px;margin:12px 0;font-size:14px;color:#555"><strong>[AI 摘要]</strong> Rust 项目宣布参与 Outreachy 计划，并选定四个开源指导项目。</div><p>Rust 项目在参与各类开源导师计划方面已有良好记录，包括连续三年（含今年）的 <a href="https://blog.rust-lang.org/2026/04/30/gsoc-2026-selected-projects/" rel="noopener noreferrer">Google Summer of Code</a>，以及此前的 <a href="https://blog.rust-lang.org/2024/05/07/OSPP-2024/" rel="noopener noreferrer">OSPP 计划</a>。我们很高兴地宣布，今年 Rust 项目还将参与从2026年5月开始的 <a href="https://www.outreachy.org/" rel="noopener noreferrer">Outreachy</a> 计划。</p>
<p>每个导师计划根据其目标群体和计划宗旨有不同的参与资格标准。Outreachy 为来自任何背景、在所处技术行业中面临代表性不足、系统性偏见或歧视的人士提供开源实习机会。您可以在 <a href="https://www.outreachy.org/" rel="noopener noreferrer">Outreachy 官网</a> 了解更多计划详情。</p>
<h2 id="what-is-outreachy-and-how-is-it-different-than-google-summer-of-code"><a href="#what-is-outreachy-and-how-is-it-different-than-google-summer-of-code" rel="noopener noreferrer"></a>
Outreachy 与 Google Summer of Code 的异同</h2>
<p>Outreachy 在某些方面与 Google Summer of Code（GSoC）相似，但也存在差异。首先，与 GSoC 不同，Outreachy 实习生需先申请整个计划，<em>然后</em>才能申请特定社区。其次，虽然 GSoC 申请者通常在申请前提交各种贡献，但 Outreachy 有一个专门的贡献期，贡献不仅可选，而且是必需的。最后，Outreachy 申请者提交的申请材料与 GSoC 类似，社区根据这些申请和实习生的贡献来选拔实习生。Outreachy 每年有两个实习期：一个从5月到8月（我们目前参与的这一期），另一个从12月到次年3月。</p>
<p>Google Summer of Code 与 Outreachy 的另一个主要区别是实习生津贴的来源。GSoC 由 Google 慷慨承担贡献者津贴和管理费用，而 Outreachy 则由社区承担实习生的津贴和管理费用。</p>
<h2 id="we-are-mentoring-4-interns-for-the-may-2026-cohort"><a href="#we-are-mentoring-4-interns-for-the-may-2026-cohort" rel="noopener noreferrer"></a>
我们将为2026年5月批次指导4名实习生</h2>
<p>由于资金和指导能力有限，Rust 项目决定选择四名实习生进行指导。以下将简要介绍这些项目。</p>
<h3 id="calling-overloaded-c-functions-from-rust"><a href="#calling-overloaded-c-functions-from-rust" rel="noopener noreferrer"></a>
从 Rust 调用重载的 C++ 函数</h3>
<p><a href="https://www.github.com/Ajay-singh1" rel="noopener noreferrer">Ajay Singh</a> 已被选中，由 <a href="https://github.com/teor2345" rel="noopener noreferrer">teor</a>、<a href="https://github.com/cramertj" rel="noopener noreferrer">Taylor Cramer</a> 和 <a href="https://github.com/thunderseethe" rel="noopener noreferrer">Ethan Smith</a> 指导。</p>
<p>该项目旨在实现实验性功能，以从 Rust 调用重载的 C++ 函数，并开始在一些代表性用例中测试该功能。</p>
<h3 id="code-coverage-of-the-rust-compiler-at-scale"><a href="#code-coverage-of-the-rust-compiler-at-scale" rel="noopener noreferrer"></a>
大规模的 Rust 编译器代码覆盖率分析</h3>
<p><a href="https://github.com/akintewe" rel="noopener noreferrer">Akintewe Oluwasola</a> 已被选中，由 <a href="https://github.com/jackh726/" rel="noopener noreferrer">Jack Huey</a> 指导。</p>
<p>该项目旨在开发工作流程，以在整个编译器测试套件和通过 Crater 检测到的生态系统 crate 规模上运行和分析编译器的代码覆盖率。希望能够检测到编译器内部以及生态系统中测试不足的情况，并构建工具对此进行持续分析。</p>
<h3 id="fuzzing-the-a-mir-formality-type-system-implementation"><a href="#fuzzing-the-a-mir-formality-type-system-implementation" rel="noopener noreferrer"></a>
对 a-mir-formality 类型系统实现进行模糊测试</h3>
<p><a href="https://github.com/System625" rel="noopener noreferrer">Tunde-Ajayi Olamiposi</a> 已被选中，由 <a href="https://github.com/nikomatsakis/" rel="noopener noreferrer">Niko Matsakis</a>、<a href="https://github.com/lqd/" rel="noopener noreferrer">Rémy Rakic</a> 和 <a href="https://github.com/tiif" rel="noopener noreferrer">tiif</a> 指导。</p>
<p>该项目旨在为 <a href="https://github.com/rust-lang/a-mir-formality/" rel="noopener noreferrer">a-mir-formality</a>（一个正在进行中的 Rust 类型和 trait 系统模型）实现模糊测试。目标是生成程序，以识别 a-mir-formality 中语义定义不足的规则。</p>
<h3 id="improve-the-security-of-github-actions-of-the-rust-project"><a href="#improve-the-security-of-github-actions-of-the-rust-project" rel="noopener noreferrer"></a>
提升 Rust 项目 GitHub Actions 的安全性</h3>
<p><a href="https://github.com/rukysandy" rel="noopener noreferrer">oghenerukevwe Sandra Idjighere</a> 已被选中，由 <a href="https://github.com/marcoieni" rel="noopener noreferrer">Marco Ieni</a> 和 <a href="https://github.com/ubiratansoares" rel="noopener noreferrer">Ubiratan Soares</a> 指导。</p>
<p>该项目旨在提升 Rust 项目所属仓库的 GitHub Actions 工作流的安全性。它将开发工具和工作流，集成现有软件，以分析 GitHub 仓库并检测其是否遵循最佳安全实践、修复现有问题，并确保未来遵循良好的安全实践。</p>
<h2 id="what-s-next"><a href="#what-s-next" rel="noopener noreferrer"></a>
下一步计划</h2>
<p>在未来3个月里，实习生们将与他们的导师密切合作，在各自项目上取得进展。实习期结束后，我们将撰写另一篇博文分享成果！届时再见！</p>
<p>我们也要感谢所有提交申请并做出贡献的人。选择哪些申请者相当困难。希望将来能再次参与 Outreachy 计划，也期待有其他参与机会。我们非常欢迎留下来并继续参与——Rust 项目中有大量参与机会。</p><p><em>由 mimo-v2.5 模型翻译，花费 3636 tokens</em></p>]]></content:encoded>
      <link>https://blog.rust-lang.org/2026/05/04/outreachy-2026-may/</link>
      <guid isPermaLink="false">https://blog.rust-lang.org/2026/05/04/outreachy-2026-may/</guid>
      <pubDate>Mon, 4 May 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>Cargo 安全公告（CVE-2026-5222）</title>
      <dc:creator>Rust Security Response Team</dc:creator>
      <description>[AI 摘要] Rust 的 Cargo 包管理器因 URL 规范化漏洞（CVE-2026-5222），在特定条件下可能泄露注册表凭证。</description>
      <content:encoded><![CDATA[<div style="background:#f0f4f8;border-left:3px solid #3b82f6;padding:12px 16px;border-radius:6px;margin:12px 0;font-size:14px;color:#555"><strong>[AI 摘要]</strong> Rust 的 Cargo 包管理器因 URL 规范化漏洞（CVE-2026-5222），在特定条件下可能泄露注册表凭证。</div><p>Rust 安全响应团队收到通知，Cargo 在使用<a href="https://doc.rust-lang.org/cargo/reference/registries.html#registry-protocols" rel="noopener noreferrer">稀疏索引协议</a>时，错误地对第三方注册表的 URL 进行了规范化处理。如果托管提供商允许在同一域内以任意名称托管多个注册表，那么能够在某个注册表中发布 crate 的攻击者，就有可能获取同一注册表中其他用户的凭证。</p>
<p>此漏洞被追踪为 CVE-2026-5222。鉴于实施攻击所需条件极其苛刻，该漏洞的严重性为<strong>低</strong>。</p>
<h2 id="overview"><a href="#overview" rel="noopener noreferrer"></a>
概述</h2>
<p>最初，Cargo 仅支持将注册表的索引存储在 git 仓库中。大多数 git 托管方案允许无论是否带有 <code>.git</code> 后缀来访问 git 仓库，因此 Cargo 在规范化注册表 URL 时也反映了这种行为。这使得 <code>https://example.com/index</code> 的凭证可以用于 <code>https://example.com/index.git</code>。</p>
<p>这种规范化被无意中应用到了新的稀疏索引上。稀疏索引可以托管在任何 HTTPS 服务器上，而这些服务器会将带有 <code>.git</code> 后缀的 URL 视为与不带后缀的 URL 不同。</p>
<p>如果满足以下条件：</p>
<ul>
<li><code>https://example.com/index</code> 是一个稀疏索引。</li>
<li><code>https://example.com/index</code> 允许 crate 依赖来自任何其他注册表的 crate。</li>
<li>攻击者能够在 <code>https://example.com/index</code> 上发布 crate。</li>
<li>攻击者能够向 <code>https://example.com/index.git</code> 上传任意文件。</li>
</ul>
<p>……攻击者可以配置 <code>https://example.com/index.git</code> 成为一个需要身份验证才能下载的 Cargo 稀疏注册表，并且其下载 URL 指向一个能记录所有凭证的服务器。</p>
<p>当攻击者随后在 <code>https://example.com/index</code> 上发布一个依赖于来自 <code>https://example.com/index.git</code> 的 crate <code>bar</code> 的 crate <code>foo</code>，并诱骗受害者下载 <code>foo</code> 时，Cargo 会认为这两个注册表共享相同的凭证，并将受害者的 Cargo 令牌发送给恶意注册表。</p>
<h2 id="mitigations"><a href="#mitigations" rel="noopener noreferrer"></a>
缓解措施</h2>
<p>将于 2026 年 5 月 28 日发布的 Rust 1.96 版本将更新 Cargo，使其仅从使用 git 协议的注册表 URL 中去除 <code>.git</code> 后缀。对于旧版本 Cargo 的用户，没有可用的缓解措施。</p>
<h2 id="affected-versions"><a href="#affected-versions" rel="noopener noreferrer"></a>
受影响的版本</h2>
<p>在 Rust 1.68（稀疏注册表稳定化）至 1.96 之间发布的所有 Cargo 版本均受影响。</p>
<h2 id="acknowledgements"><a href="#acknowledgements" rel="noopener noreferrer"></a>
致谢</h2>
<p>我们要感谢 Christos Papakonstantinou 根据<a href="https://rust-lang.org/policies/security" rel="noopener noreferrer"> Rust 安全策略</a>向我们报告此问题。</p>
<p>我们还要感谢帮助我们处理此漏洞的 Rust 项目成员：Arlo Siemens 开发了修复；Weihang Lo、Eric Huss 和 Emily Albini 审核了修复；Emily Albini 撰写了本公告；Emily Albini、Josh Stone 和 Manish Goregaokar 协调了披露工作。</p><p><em>由 mimo-v2.5 模型翻译，花费 2195 tokens</em></p>]]></content:encoded>
      <link>https://blog.rust-lang.org/2026/05/25/cve-2026-5222/</link>
      <guid isPermaLink="false">https://blog.rust-lang.org/2026/05/25/cve-2026-5222/</guid>
      <pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>关于 Cargo 的安全公告（CVE-2026-5223）</title>
      <dc:creator>Rust Security Response Team</dc:creator>
      <description>[AI 摘要] 此公告披露了 Cargo 中一个中等严重性的符号链接漏洞（CVE-2026-5223），影响第三方注册中心用户，并将在 Rust 1.96.0 中修复。</description>
      <content:encoded><![CDATA[<div style="background:#f0f4f8;border-left:3px solid #3b82f6;padding:12px 16px;border-radius:6px;margin:12px 0;font-size:14px;color:#555"><strong>[AI 摘要]</strong> 此公告披露了 Cargo 中一个中等严重性的符号链接漏洞（CVE-2026-5223），影响第三方注册中心用户，并将在 Rust 1.96.0 中修复。</div><p>Rust 安全响应团队获悉，Cargo 在处理从第三方注册中心下载的 crate tarball 中的符号链接时存在错误处理，这允许恶意 crate 覆盖同一注册中心中其他 crate 的源代码。</p>
<p>此漏洞被追踪为 CVE-2026-5223。对于第三方注册中心的用户，该漏洞的严重性为<strong>中等</strong>。crates.io 的用户<strong>不受影响</strong>，因为 crates.io 禁止上传包含任何符号链接的 crate。</p>
<h2 id="overview"><a href="#overview" rel="noopener noreferrer"></a>
概述</h2>
<p>构建 crate 时，Cargo 将其源代码提取到本地缓存（存储在 <code>~/.cargo</code> 中）中，并为未来的构建重用。Cargo 包含保护措施，以防止任何文件被提取到 crate 自身的缓存目录之外。</p>
<p>经发现，可以制作一个恶意 tarball，它能将文件提取到 crate 自身缓存目录的下一级。根据缓存的结构方式，这允许恶意 crate 覆盖属于同一注册中心的其他 crate 的缓存。</p>
<h2 id="mitigations"><a href="#mitigations" rel="noopener noreferrer"></a>
缓解措施</h2>
<p>计划于 2026 年 5 月 28 日发布的 Rust 1.96.0 将更新 Cargo，拒绝解压 crate tarball 中的<strong>任何</strong>符号链接，无论它们来自 crates.io（已经禁止）还是第三方注册中心。请注意，Cargo 在运行 <code>cargo package</code> 或 <code>cargo publish</code> 时从未添加过符号链接，因此这的影响应该很小。</p>
<p>建议无法升级到最新 Rust 版本的用户审核其注册中心中是否存在任何符号链接，并配置其注册中心以拒绝符号链接（如果该选项可用）。</p>
<h2 id="affected-versions"><a href="#affected-versions" rel="noopener noreferrer"></a>
受影响的版本</h2>
<p>所有在 Rust 1.96.0 之前发布的 Cargo 版本均受影响。</p>
<h2 id="acknowledgements"><a href="#acknowledgements" rel="noopener noreferrer"></a>
致谢</h2>
<p>我们感谢 Christos Papakonstantinou 根据 <a href="https://rust-lang.org/policies/security" rel="noopener noreferrer">Rust 安全策略</a> 向我们报告此问题。</p>
<p>我们还要感谢帮助我们处理此漏洞的 Rust 项目成员：Josh Triplett 开发了修复方案；Arlo Siemsen 审阅了修复方案；Emily Albini 撰写了此公告；Emily Albini、Josh Stone 和 Manish Goregaokar 协调了披露；Ed Page 和 Eric Huss 在披露过程中提供了建议。</p><p><em>由 mimo-v2.5 模型翻译，花费 1761 tokens</em></p>]]></content:encoded>
      <link>https://blog.rust-lang.org/2026/05/25/cve-2026-5223/</link>
      <guid isPermaLink="false">https://blog.rust-lang.org/2026/05/25/cve-2026-5223/</guid>
      <pubDate>Mon, 25 May 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>宣布 Rust 1.96.0</title>
      <dc:creator>The Rust Release Team</dc:creator>
      <description>[AI 摘要] Rust 1.96.0 版本发布，引入新的范围类型、断言宏，并修复了 WebAssembly 目标和 Cargo 漏洞。</description>
      <content:encoded><![CDATA[<div style="background:#f0f4f8;border-left:3px solid #3b82f6;padding:12px 16px;border-radius:6px;margin:12px 0;font-size:14px;color:#555"><strong>[AI 摘要]</strong> Rust 1.96.0 版本发布，引入新的范围类型、断言宏，并修复了 WebAssembly 目标和 Cargo 漏洞。</div><p>Rust 团队很高兴地宣布 Rust 的新版本 1.96.0。Rust 是一种编程语言，赋能每个人构建可靠且高效的软件。</p>
<p>如果您已通过 <code>rustup</code> 安装了以前的 Rust 版本，可以通过以下方式获取 1.96.0：</p>
<pre><code><span><span>$</span><span> rustup update stable</span></span></code></pre>
<p>如果您还没有安装，可以从我们网站的相应页面<a href="https://www.rust-lang.org/install.html" rel="noopener noreferrer">获取 <code>rustup</code></a>，并查看<a href="https://doc.rust-lang.org/stable/releases.html#version-1960-2026-05-28" rel="noopener noreferrer">1.96.0 的详细发布说明</a>。</p>
<p>如果您想通过测试未来版本来帮助我们，可以考虑在本地更新到使用 beta 通道（<code>rustup default beta</code>）或 nightly 通道（<code>rustup default nightly</code>）。请<a href="https://github.com/rust-lang/rust/issues/new/choose" rel="noopener noreferrer">报告</a>您可能遇到的任何错误！</p>
<h2 id="what-s-in-1-96-0-stable"><a href="#what-s-in-1-96-0-stable" rel="noopener noreferrer"></a>
1.96.0 稳定版中的内容</h2>
<h3 id="new-range-types"><a href="#new-range-types" rel="noopener noreferrer"></a>
新的 <code>Range*</code> 类型</h3>
<p>许多用户期望 <code>Range</code> 和相关的 <code>core::ops</code> 类型是 <code>Copy</code> 的，但事实并非如此：它们直接实现 <code>Iterator</code>，而<a href="https://rust-lang.github.io/rust-clippy/rust-1.95.0/index.html#copy_iterator" rel="noopener noreferrer">在同一类型上同时实现 <code>Iterator</code> 和 <code>Copy</code> 是一个陷阱</a>，因此已避免这样做。<a href="https://rust-lang.github.io/rfcs/3550-new-range.html" rel="noopener noreferrer">RFC3550</a> 提出了一组替代范围类型，这些类型实现 <code>IntoIterator</code> 而非 <code>Iterator</code>，这意味着它们也可以是 <code>Copy</code> 的。该 RFC 的标准库部分现已稳定，引入了：</p>
<ul>
<li><code>core::range::Range</code></li>
<li><code>core::range::RangeFrom</code></li>
<li><code>core::range::RangeInclusive</code></li>
<li>关联迭代器</li>
</ul>
<p>在不久的将来，Rust 版本还将添加 <code>core::range::RangeFull</code> 和 <code>core::range::RangeTo</code> 作为从 <code>core::ops</code> 的重导出（这些不实现 <code>Iterator</code> 并且已经实现 <code>Copy</code>），以及 <code>core::range::legacy::*</code> 作为当前范围的新位置。像 <code>0..1</code> 这样的范围语法目前仍产生传统类型，但将在未来版本中更新为 <code>core::range</code> 类型。</p>
<p>随着这些稳定化，现在可以在 <code>Copy</code> 类型中存储切片访问器，而无需拆分 <code>start</code> 和 <code>end</code>：</p>
<pre><code><span><span>use</span><span> core</span><span>::</span><span>range</span><span>::</span><span>Range</span><span>;</span></span>
<span></span>
<span><span>#</span><span>[</span><span>derive</span><span>(</span><span>Clone</span><span>,</span><span> Copy</span><span>)</span><span>]</span></span>
<span><span>pub</span><span> struct</span><span> Span</span><span>(</span><span>Range</span><span>&lt;</span><span>usize</span><span>&gt;</span><span>)</span><span>;</span></span>
<span></span>
<span><span>impl</span><span> Span</span><span> {</span></span>
<span><span>    pub</span><span> fn</span><span> of</span><span>(</span><span>self</span><span>,</span><span> s</span><span>:</span><span> &amp;</span><span>str</span><span>)</span><span> -&gt;</span><span> &amp;</span><span>str</span><span> {</span></span>
<span><span>        &amp;</span><span>s</span><span>[</span><span>self</span><span>.</span><span>0</span><span>]</span></span>
<span><span>    }</span></span>
<span><span>}</span></span></code></pre>
<p>新的 <code>RangeInclusive</code> 还使其字段公开，而不像传统版本避免暴露耗尽的迭代器状态。对于新类型，这不是问题，因为它必须转换才能开始迭代。</p>
<p>库作者应考虑在公共 API 中使用 <code>impl RangeBounds</code>，它接受传统和新的范围类型。如果需要具体类型，请优先使用新范围，因为这最终将成为默认值。</p>
<h3 id="assert-matching-patterns"><a href="#assert-matching-patterns" rel="noopener noreferrer"></a>
断言匹配模式</h3>
<p>新的宏 <code>assert_matches!</code> 和 <code>debug_assert_matches!</code> 检查值是否匹配给定模式，否则使用值的 <code>Debug</code> 表示进行 panic。这些本质上与 <code>assert!(matches!(..))</code> 和 <code>debug_assert!(matches!(..))</code> 相同，但打印的值提高了诊断失败的可能性。</p>
<p>这些新宏未添加到标准预导入中，因为它们会与提供同名宏的流行第三方 crate 冲突。相反，应在使用前从 <code>core</code> 或 <code>std</code> 手动导入。</p>
<pre><code><span><span>use</span><span> core</span><span>::</span><span>assert_matches</span><span>;</span></span>
<span></span>
<span><span>///</span><span> [Random Number](https://xkcd.com/221/)</span></span>
<span><span>fn</span><span> get_random_number</span><span>(</span><span>)</span><span> -&gt;</span><span> u32</span><span> {</span></span>
<span><span>    //</span><span> chosen by a fair dice roll.</span></span>
<span><span>    //</span><span> guaranteed to be random.</span></span>
<span><span>    4</span></span>
<span><span>}</span></span>
<span></span>
<span><span>fn</span><span> main</span><span>(</span><span>)</span><span> {</span></span>
<span><span>    assert_matches!</span><span>(</span><span>get_random_number</span><span>(</span><span>)</span><span>,</span><span> 1</span><span>..=</span><span> 6</span><span>)</span><span>;</span></span>
<span><span>}</span></span></code></pre>
<h3 id="changes-to-webassembly-targets"><a href="#changes-to-webassembly-targets" rel="noopener noreferrer"></a>
WebAssembly 目标的更改</h3>
<p>WebAssembly 目标不再向链接器传递 <code>--allow-undefined</code>，这意味着链接时的未定义符号现在会导致链接器错误，而不是被转换为来自 <code>"env"</code> 模块的 WebAssembly 导入。此更改防止模块链接，除非所有链接相关符号都已定义，以便更早地捕获错误并防止符号命名或类似问题的意外问题。</p>
<p>未定义的链接相关符号通常表明与构建时间相关的错误或错误配置。但是，如果旧行为是预期的，则可以通过 <code>RUSTFLAGS=-Clink-arg=--allow-undefined</code> 或通过编辑源代码并在定义符号的块上使用 <code>#[link(wasm_import_module = "env")]</code> 来重新启用。</p>
<p>此更改已在<a href="https://blog.rust-lang.org/2026/04/04/changes-to-webassembly-targets-and-handling-undefined-symbols/" rel="noopener noreferrer">本博客中先前宣布</a>，现在在 Rust 1.96 中生效。</p>
<h3 id="stabilized-apis"><a href="#stabilized-apis" rel="noopener noreferrer"></a>
稳定化的 API</h3>
<ul>
<li><a href="https://doc.rust-lang.org/stable/std/macro.assert_matches.html" rel="noopener noreferrer"><code>assert_matches!</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/macro.debug_assert_matches.html" rel="noopener noreferrer"><code>debug_assert_matches!</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/panic/struct.AssertUnwindSafe.html#impl-From%3CT%3E-for-AssertUnwindSafe%3CT%3E" rel="noopener noreferrer"><code>From&lt;T&gt; for AssertUnwindSafe&lt;T&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/cell/struct.LazyCell.html#impl-From%3CT%3E-for-LazyCell%3CT,+F%3E" rel="noopener noreferrer"><code>From&lt;T&gt; for LazyCell&lt;T, F&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/std/sync/struct.LazyLock.html#impl-From%3CT%3E-for-LazyLock%3CT,+F%3E" rel="noopener noreferrer"><code>From&lt;T&gt; for LazyLock&lt;T, F&gt;</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeToInclusive.html" rel="noopener noreferrer"><code>core::range::RangeToInclusive</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeFrom.html" rel="noopener noreferrer"><code>core::range::RangeFrom</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeFromIter.html" rel="noopener noreferrer"><code>core::range::RangeFromIter</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.Range.html" rel="noopener noreferrer"><code>core::range::Range</code></a></li>
<li><a href="https://doc.rust-lang.org/stable/core/range/struct.RangeIter.html" rel="noopener noreferrer"><code>core::range::RangeIter</code></a></li>
</ul>
<h3 id="two-cargo-advisories"><a href="#two-cargo-advisories" rel="noopener noreferrer"></a>
两个 Cargo 公告</h3>
<p>Rust 1.96 包含针对第三方注册表用户的两个漏洞修复。</p>
<ul>
<li>
<p><a href="https://blog.rust-lang.org/2026/05/25/cve-2026-5223/" rel="noopener noreferrer">CVE-2026-5223</a> 是一个<strong>中等</strong>严重性漏洞，涉及使用符号链接提取 crate 压缩包。</p>
</li>
<li>
<p><a href="https://blog.rust-lang.org/2026/05/25/cve-2026-5222/" rel="noopener noreferrer">CVE-2026-5222</a> 是一个<strong>低</strong>严重性漏洞，涉及使用规范化 URL 进行身份验证。</p>
</li>
</ul>
<p>crates.io 用户<strong>不受</strong>任何漏洞影响。</p>
<h3 id="other-changes"><a href="#other-changes" rel="noopener noreferrer"></a>
其他更改</h3>
<p>查看 <a href="https://github.com/rust-lang/rust/releases/tag/1.96.0" rel="noopener noreferrer">Rust</a>、<a href="https://doc.rust-lang.org/nightly/cargo/CHANGELOG.html#cargo-196-2026-05-28" rel="noopener noreferrer">Cargo</a> 和 <a href="https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-196" rel="noopener noreferrer">Clippy</a> 中的所有更改。</p>
<h2 id="contributors-to-1-96-0"><a href="#contributors-to-1-96-0" rel="noopener noreferrer"></a>
1.96.0 的贡献者</h2>
<p>许多人共同创建了 Rust 1.96.0。没有你们，我们无法完成。<a href="https://thanks.rust-lang.org/rust/1.96.0/" rel="noopener noreferrer">谢谢！</a></p><p><em>由 mimo-v2.5 模型翻译，花费 8481 tokens</em></p>]]></content:encoded>
      <link>https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/</link>
      <guid isPermaLink="false">https://blog.rust-lang.org/2026/05/28/Rust-1.96.0/</guid>
      <pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>启动 Rust 基金会维护者基金</title>
      <dc:creator>Funding team</dc:creator>
      <description>[AI 摘要] Rust 基金会启动维护者基金，旨在通过新设的资金团队和“驻场维护者”计划，为 Rust 核心维护者提供稳定长期的经济支持。</description>
      <content:encoded><![CDATA[<div style="background:#f0f4f8;border-left:3px solid #3b82f6;padding:12px 16px;border-radius:6px;margin:12px 0;font-size:14px;color:#555"><strong>[AI 摘要]</strong> Rust 基金会启动维护者基金，旨在通过新设的资金团队和“驻场维护者”计划，为 Rust 核心维护者提供稳定长期的经济支持。</div><blockquote>
<p>如果您希望在经济上支持 Rust 的开发，请考虑<a href="https://github.com/sponsors/rustfoundation" rel="noopener noreferrer">捐赠</a>给 Rust 基金会维护者基金。</p>
</blockquote>
<p>几个月前，Rust 基金会宣布了<a href="https://rustfoundation.org/media/announcing-the-rust-foundation-maintainers-fund/" rel="noopener noreferrer">Rust 基金会维护者基金</a>（RFMF）。自那时起，Rust 项目一直与 Rust 基金会密切合作，以确定该基金将如何具体用于支持 Rust 维护者。这促成了<a href="https://rust-lang.github.io/rfcs/3931-rfmf-rust-foundation-maintainer-fund.html" rel="noopener noreferrer">RFC #3931</a> 的接受，该 RFC 建立了<a href="https://rust-lang.org/governance/teams/launching-pad/#team-funding" rel="noopener noreferrer">资金团队</a>以及<a href="https://rust-lang.github.io/rfcs/3931-rfmf-rust-foundation-maintainer-fund.html#expectations-placed-on-maintainers-in-residence" rel="noopener noreferrer">驻场维护者</a>计划。</p>
<p>资金团队的主要目标是确保从事 Rust 及其工具链工作的维护者得到适当的支持。我们将与 Rust 项目成员交谈，了解他们的资金状况；与 Rust 团队负责人会面，了解他们的维护需求；接触公司，寻找他们通过支持 Rust 维护者来投资 Rust 的机会；协调各种资金筹措工作，并确保在<a href="https://rust-lang.org/governance/teams/launching-pad/#team-content" rel="noopener noreferrer">内容团队</a>的帮助下，资助维护工作的积极影响得到显著宣传。</p>
<p><a href="https://rust-lang.github.io/rfcs/3931-rfmf-rust-foundation-maintainer-fund.html#expectations-placed-on-maintainers-in-residence" rel="noopener noreferrer">驻场维护者</a>是一项新的计划，旨在为现有的 Rust 项目维护者提供经济支持<sup id="fr-dir-1"><a href="#fn-dir" rel="noopener noreferrer">1</a></sup>。每位驻场维护者将获得资金以<a href="https://blog.rust-lang.org/inside-rust/2026/01/12/what-is-maintenance-anyway/" rel="noopener noreferrer">维护</a> Rust 的一个或多个关键部分，例如编译器、标准库、Cargo、Clippy 或 Rust 项目开发和维护的众多其他项目之一。资助的工作将包括执行大规模重构、代码审查、为新功能解除阻碍、问题分类、指导其他贡献者等活动，并将根据其支持团队的指导优先级与他们自身在项目内选择的优先级进行分配。在适用的情况下，也鼓励驻场维护者提出、倡导并推动<a href="https://rust-lang.github.io/rust-project-goals/" rel="noopener noreferrer">Rust 项目目标</a>。</p>
<p>该计划的目标是提供稳定且长期的资金支持，使维护者能够专注于确保 Rust 长期健康的重要工作。资金团队将根据资金可用性和 Rust 项目内的维护需求来选择驻场维护者，并帮助确保他们取得成功。我们预计这通常是一个（接近）全职的职位，但这将取决于工作性质和维护领域。</p>
<p>该计划扩展了我们对 Rust 维护者的现有支持，例如<a href="https://blog.rust-lang.org/inside-rust/2026/04/09/program-management-update-2026-03/" rel="noopener noreferrer">项目管理计划</a>和<a href="https://blog.rust-lang.org/inside-rust/2025/06/05/a-glance-at-the-team-compiler-operations" rel="noopener noreferrer">编译器运维计划</a>。一个重要的发展是，我们现在有一个集中的<a href="https://github.com/sponsors/rustfoundation" rel="noopener noreferrer">机制</a>来收集个人和公司的捐款，以及一个专门的团队来帮助将这些资金定向分配给特定的维护者。您可以在<a href="https://rust-lang.github.io/rfcs/3931-rfmf-rust-foundation-maintainer-fund.html" rel="noopener noreferrer">RFC</a>中找到有关资金团队和驻场维护者计划的更多详细信息。</p>
<p>我们预计将在未来几个月内聘请第一位驻场维护者，并在此博客上宣布，敬请期待！</p>
<h2 id="how-to-contribute-funds"><a href="#how-to-contribute-funds" rel="noopener noreferrer"></a>
如何贡献资金</h2>
<p>如果您是希望帮助 Rust 取得成功并蓬勃发展的个人，您可以通过<a href="https://github.com/sponsors/rustfoundation" rel="noopener noreferrer">GitHub Sponsors</a><sup id="fr-sponsors-1"><a href="#fn-sponsors" rel="noopener noreferrer">2</a></sup>向 RFMF 捐款。希望投资于 Rust 更好维护的公司也可以通过 GitHub Sponsors 捐款，或直接<a href="mailto:contact@rustfoundation.org" rel="noopener noreferrer">联系</a> Rust 基金会。</p>
<p>重要的是，<strong>该基金的所有收益将直接用于支持 Rust 项目维护者</strong>。我们目前预计这主要通过驻场维护者计划实现，但也可以根据资金团队的决定，以小额赠款或其他机制的形式进行。我们将在过程中弄清楚这一点，因为这对我们来说也是相当新的。</p>
<p>我们非常感谢每一笔捐款，无论金额多小，因为有了更多的资金，我们可以聘请更多的维护者，以确保我们能够继续开发 Rust，并且重要的改进不会被维护任务所阻碍。这一点在当前尤为重要，因为 Rust 在工业界的各种应用领域正开始被越来越广泛地采用，这增加了对持续维护的需求。多种资金来源的重要性因我们目前观察到的一个不幸趋势而更加凸显：关键 Rust 维护者因预算调整而失去了其 Rust 工作的资金。Rust 基金会维护者基金旨在为 Rust 维护者提供稳定的资金支持，使其较少依赖于就业市场和 IT 行业的突然变化。</p>
<p>与大多数事情一样，没有一种万能的解决方案，因此有多种方式可以在经济上支持 Rust。<a href="https://rustnl.org/maintainers" rel="noopener noreferrer">RustNL 维护者团队</a>最近聘请了几位 Rust 项目维护者。此前，我们<a href="https://blog.rust-lang.org/2025/12/08/making-it-easier-to-sponsor-rust-contributors/" rel="noopener noreferrer">撰文</a>介绍了您可以如何支持从事 Rust 工作的特定个人。还有一些<a href="https://rust-lang.github.io/rust-project-goals/2026/funding.html" rel="noopener noreferrer">正在寻求资金</a>的 Rust 项目目标。我们欢迎所有能够帮助支持 Rust 项目维护者的努力，他们经常以志愿者身份从事几乎默默无闻且缺乏感激的工作，但同时这些工作又极其重要和必要。</p>
<p>感谢您考虑赞助 Rust 的开发和维护！您可以在我们的<a href="https://rust-lang.org/funding/" rel="noopener noreferrer">资金页面</a>上找到有关资助 Rust 的更多信息。</p>

<ol>
<li id="fn-dir">
<p>本计划的灵感来源于 Python 软件基金会（PSF）使用的<a href="https://www.python.org/psf/developersinresidence/" rel="noopener noreferrer">驻场开发者</a>概念，我们与他们进行了几次有益的讨论。谢谢您，PSF！ <a href="#fr-dir-1" rel="noopener noreferrer">↩</a></p>
</li>
<li id="fn-sponsors">
<p>请注意，GitHub Sponsors 目前在 <code>rustfoundation</code> GitHub 组织而非 <code>rust-lang</code> 组织上启用，这是一个可能在未来改变的实现细节。此赞助页面上筹集的所有捐款都将流向 Rust 基金会维护者基金，并将用于直接支持 Rust 项目维护者。 <a href="#fr-sponsors-1" rel="noopener noreferrer">↩</a></p>
</li>
</ol>
<p><em>由 mimo-v2.5 模型翻译，花费 4204 tokens</em></p>]]></content:encoded>
      <link>https://blog.rust-lang.org/2026/06/02/launching-the-rust-foundation-maintainers-fund/</link>
      <guid isPermaLink="false">https://blog.rust-lang.org/2026/06/02/launching-the-rust-foundation-maintainers-fund/</guid>
      <pubDate>Tue, 2 Jun 2026 00:00:00 +0000</pubDate>
    </item>
    <item>
      <title>项目目标更新——2026年4月（2025年下半年结束）</title>
      <dc:creator>Nurzhan Saken</dc:creator>
      <description>&lt;p&gt;2025年下半年项目目标期现已结束。在这几个月里，Rust 项目推进了 &lt;a rel=&quot;external&quot; href=&quot;https://rust-lang.github.io/rust-project-goals/2025h2/goals.html&quot;&gt;41 个项目目标&lt;/a&gt;，其中 13 个被指定为 &lt;a rel=&quot;external&quot; href=&quot;https://rust-lang.gith</description>
      <content:encoded><![CDATA[<p>2025年下半年项目目标期现已结束。在这几个月里，Rust 项目推进了 <a href="https://rust-lang.github.io/rust-project-goals/2025h2/goals.html" rel="noopener noreferrer">41 个项目目标</a>，其中 13 个被指定为 <a href="https://rust-lang.github.io/rust-project-goals/2025h2/goals.html#flagship-goals" rel="noopener noreferrer">旗舰目标</a>。本篇包含自<a href="https://blog.rust-lang.org/2026/01/05/project-goals-2025-december-update/" rel="noopener noreferrer">上篇</a>以来我们进展的精选更新，以及每个目标的最终状态（其中许多目标将在2026年期间继续）。任何特定目标的完整详情可在其<a href="https://github.com/rust-lang/rust-project-goals/issues?q=is%3Aissue%20label%3Aex-2025h2" rel="noopener noreferrer">跟踪议题</a>中找到。</p>
<p>感谢所有贡献者！&lt;3</p>
<h2 id="table-of-contents"><a href="#table-of-contents" rel="noopener noreferrer"></a>
目录</h2>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-beyond-the" rel="noopener noreferrer">旗舰目标：超越 <code>&amp;</code></a>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#continue-experimentation-with-pin-ergonomics" rel="noopener noreferrer">继续 Pin 人体工学实验</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#design-a-language-feature-to-solve-field-projections" rel="noopener noreferrer">设计语言特性以解决字段投影</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#reborrow-traits" rel="noopener noreferrer">Reborrow traits</a></li>
</ul>
</li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-flexible-fast-er-compilation" rel="noopener noreferrer">旗舰目标：灵活、更快的编译</a>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#build-std" rel="noopener noreferrer">build-std</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#production-ready-cranelift-backend" rel="noopener noreferrer">生产就绪的 cranelift 后端</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#promoting-parallel-front-end" rel="noopener noreferrer">推广并行前端</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#relink-don-t-rebuild" rel="noopener noreferrer">重链接而非重建</a></li>
</ul>
</li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-higher-level-rust" rel="noopener noreferrer">旗舰目标：更高层次的 Rust</a>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#ergonomic-ref-counting-rfc-decision-and-preview" rel="noopener noreferrer">人体工学引用计数：RFC 决策与预览</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilize-cargo-script" rel="noopener noreferrer">稳定化 cargo-script</a></li>
</ul>
</li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#flagship-unblocking-dormant-traits" rel="noopener noreferrer">旗舰目标：解锁休眠的 traits</a>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#evolving-trait-hierarchies" rel="noopener noreferrer">演进 trait 层次结构</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#in-place-initialization" rel="noopener noreferrer">就地初始化</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#next-generation-trait-solver" rel="noopener noreferrer">下一代 trait 求解器</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilizable-polonius-support-on-nightly" rel="noopener noreferrer">可稳定化的 Polonius 支持（nightly）</a></li>
</ul>
</li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#other-goal-updates" rel="noopener noreferrer">其他目标更新</a>
<ul>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#add-a-team-charter-for-rustdoc-team" rel="noopener noreferrer">为 rustdoc 团队添加团队章程</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#borrow-checking-in-a-mir-formality" rel="noopener noreferrer">a-mir-formality 中的借用检查</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#c-rust-interop-problem-space-mapping" rel="noopener noreferrer">C++/Rust 互操作问题空间映射</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#comprehensive-niche-checks-for-rust" rel="noopener noreferrer">Rust 的全面 niche 检查</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#const-generics" rel="noopener noreferrer">常量泛型</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#continue-resolving-cargo-semver-checks-blockers-for-merging-into-cargo" rel="noopener noreferrer">继续解决 <code>cargo-semver-checks</code> 合并到 cargo 的阻塞问题</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#develop-the-capabilities-to-keep-the-fls-up-to-date" rel="noopener noreferrer">开发保持 FLS 更新的能力</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#emit-retags-in-codegen" rel="noopener noreferrer">在代码生成中发射 Retags</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#expand-the-rust-reference-to-specify-more-aspects-of-the-rust-language" rel="noopener noreferrer">扩展 Rust 参考手册以规范 Rust 语言的更多方面</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#finish-the-libtest-json-output-experiment" rel="noopener noreferrer">完成 libtest json 输出实验</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#finish-the-std-offload-module" rel="noopener noreferrer">完成 std::offload 模块</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#getting-rust-for-linux-into-stable-rust-compiler-features" rel="noopener noreferrer">将 Rust for Linux 引入稳定 Rust：编译器特性</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#getting-rust-for-linux-into-stable-rust-language-features" rel="noopener noreferrer">将 Rust for Linux 引入稳定 Rust：语言特性</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#implement-open-api-namespace-support" rel="noopener noreferrer">实现 Open API 命名空间支持</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#mir-move-elimination" rel="noopener noreferrer">MIR 移动消除</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#prototype-a-new-set-of-cargo-plumbing-commands" rel="noopener noreferrer">原型化一套新的 Cargo "管道" 命令</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#prototype-cargo-build-analysis" rel="noopener noreferrer">原型化 Cargo 构建分析</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#reflection-and-comptime" rel="noopener noreferrer">反射与编译时</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rework-cargo-build-dir-layout" rel="noopener noreferrer">重构 Cargo 构建目录布局</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#run-more-tests-for-gcc-backend-in-the-rust-s-ci" rel="noopener noreferrer">在 Rust 的 CI 中为 GCC 后端运行更多测试</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rust-stabilization-of-memorysanitizer-and-threadsanitizer-support" rel="noopener noreferrer">Rust 稳定化内存消毒器和线程消毒器支持</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rust-vision-document" rel="noopener noreferrer">Rust 愿景文档</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#rustc-perf-improvements" rel="noopener noreferrer">rustc 性能改进</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilize-public-private-dependencies" rel="noopener noreferrer">稳定化公开/私有依赖</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#stabilize-rustdoc-doc-cfg-feature" rel="noopener noreferrer">稳定化 rustdoc 的 <code>doc_cfg</code> 特性</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#sve-and-sme-on-aarch64" rel="noopener noreferrer">AArch64 上的 SVE 和 SME</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#type-system-documentation" rel="noopener noreferrer">类型系统文档</a></li>
<li><a href="https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/#unsafe-fields" rel="noopener noreferrer">Unsafe 字段</a></li>
</ul>
</li>
</ul>
<hr>
<h2 id="flagship-beyond-the"><a href="#flagship-beyond-the" rel="noopener noreferrer"></a>
旗舰目标：超越 <code>&amp;</code></h2>
<h3 id="continue-experimentation-with-pin-ergonomics"><a href="#continue-experimentation-with-pin-ergonomics" rel="noopener noreferrer"></a>
<a href="https://github.com/rust-lang/rust-project-goals/issues/389" rel="noopener noreferrer">继续 Pin 人体工学实验</a></h3>
<ul>
<li><strong>参与人员：</strong> <strong><a href="https://github.com/frank-king" rel="noopener noreferrer">Frank King</a></strong></li>
<li><strong>倡导者：</strong> <a href="http://github.com/rust-lang/compiler-team" rel="noopener noreferrer">compiler</a> (<a href="https://github.com/oli-obk" rel="noopener noreferrer">Oliver Scherer</a>)， <a href="http://github.com/rust-lang/lang-team" rel="noopener noreferrer">lang</a> (<a href="https://github.com/traviscross" rel="noopener noreferrer">TC</a>)</li>
<li><strong>状态：</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/pin-ergonomics.html" rel="noopener noreferrer">已延续</a></li>
</ul>
<details>
<summary>提供 3 项详细更新。</summary>
<ul>
<li>
<p><strong><a href="https://github.com/frank-king" rel="noopener noreferrer">Frank King</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/389#issuecomment-3963321984" rel="noopener noreferrer">2026-02-26 的评论</a></p>
<blockquote>
<p>（刚从春节回来）</p>
<ul>
<li>（本地，尚未提交 PR）：设计并实现 <code>&amp;pin</code> 的借用检查算法</li>
<li>审查了 <a href="https://github.com/rust-lang/rust/pull/144537" rel="noopener noreferrer">为固定掉用添加 <code>Drop::pin_drop</code></a>，以更新 <code>book</code> 子模块</li>
<li>审查了 <a href="https://github.com/rust-lang/rust/pull/149130" rel="noopener noreferrer">当 <code>T: Unpin</code> 时实现 <code>&amp;pin (mut|const) T</code> 和 <code>&amp;(mut) T</code> 之间的强制转换</a>，并根据审查信息进行了一些重构。</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/frank-king" rel="noopener noreferrer">Frank King</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/389#issuecomment-4064499322" rel="noopener noreferrer">2026-03-16 的评论</a></p>
<blockquote>
<ul>
<li>合并了 <a href="https://github.com/rust-lang/rust/pull/149130" rel="noopener noreferrer">当 <code>T: Unpin</code> 时实现 <code>&amp;pin (mut|const) T</code> 和 <code>&amp;(mut) T</code> 之间的强制转换</a>。</li>
<li>提交了草稿 PR <a href="https://github.com/rust-lang/rust/pull/153693" rel="noopener noreferrer">为 <code>&amp;pin mut|const $place</code> 实现借用检查</a>。该实现需要在社区审查之前进行完善和自查。</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/frank-king" rel="noopener noreferrer">Frank King</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/389#issuecomment-4258655696" rel="noopener noreferrer">2026-04-16 的评论</a></p>
<blockquote>
<p>自查了 <a href="https://github.com/rust-lang/rust/pull/153693" rel="noopener noreferrer">为 <code>&amp;pin mut|const $place</code> 实现借用检查</a>。发现当前处理固定借用的方法可能不正确，因为它未能区分固定借用和普通引用到固定引用的强制转换。后者不会阻止移动 <code>T: Unpin</code> 类型，但前者会，这破坏了固定引用强制转换测试。</p>
</blockquote>
</li>
</ul>
</details>
<h3 id="design-a-language-feature-to-solve-field-projections"><a href="#design-a-language-feature-to-solve-field-projections" rel="noopener noreferrer"></a>
<a href="https://github.com/rust-lang/rust-project-goals/issues/390" rel="noopener noreferrer">设计语言特性以解决字段投影</a></h3>
<ul>
<li><strong>参与人员：</strong> <strong><a href="https://github.com/BennoLossin" rel="noopener noreferrer">Benno Lossin</a></strong></li>
<li><strong>倡导者：</strong> <a href="http://github.com/rust-lang/lang-team" rel="noopener noreferrer">lang</a> (<a href="https://github.com/tmandry" rel="noopener noreferrer">Tyler Mandry</a>)</li>
<li><strong>状态：</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/field-projections.html" rel="noopener noreferrer">已延续</a></li>
</ul>
<details>
<summary>提供 5 项详细更新。</summary>
<ul>
<li>
<p><strong><a href="https://github.com/BennoLossin" rel="noopener noreferrer">Benno Lossin</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3703190328" rel="noopener noreferrer">2026-01-01 的评论</a></p>
<blockquote>
<ul>
<li>在12月初，我们开始着手回答关于虚拟位置（virtual places）方法的<a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3621913656" rel="noopener noreferrer">五个重要问题</a>。我们讨论了四个问题，并得出了三个答案。
<ul>
<li>我们研究的第一个问题是问题3 <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3644702112" rel="noopener noreferrer">规范投影（Canonical Projections）</a>。</li>
<li>接下来我们研究了问题4 <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3659055067" rel="noopener noreferrer">非间接容器（Non-Indirected Containers）</a>。</li>
<li>作为我们回答的最后一个问题，我们研究了问题1 <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3677624396" rel="noopener noreferrer">逐字段投影与一次性投影</a>。</li>
<li>目前，我们正在研究问题2，并且我写了一篇<a href="https://bennolossin.github.io/blog/field-projections/virtual-places-and-borrowck.html" rel="noopener noreferrer">博客文章</a>，其中包含一个潜在解决方案，但仍需要反馈。</li>
</ul>
</li>
<li>我们启动了一个 <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3690808729" rel="noopener noreferrer">Wiki 项目</a>，将我们的知识汇总到一处。
<ul>
<li>我们<a href="https://github.com/rust-lang/beyond-refs/pull/9" rel="noopener noreferrer">实现了一个算法</a>来确定位置表达式的类型。</li>
</ul>
</li>
<li>我们的计划是在下一个目标期延续此项目目标。</li>
</ul>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BennoLossin" rel="noopener noreferrer">Benno Lossin</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3796971577" rel="noopener noreferrer">2026-01-25 的评论</a></p>
<blockquote>
<p>本月早些时候，<a href="https://github.com/Nadrieril" rel="noopener noreferrer">Nadrieril</a>、<a href="https://github.com/dingxiangfei2009" rel="noopener noreferrer">Ding Xiang Fei</a> 和我就字段投影世界中的 autoref 和方法解析举行了一次会议。这次会议产生了一个新的 wiki 页面 <a href="https://rust-lang.github.io/beyond-refs/autoref.html" rel="noopener noreferrer">autoref</a>。</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BennoLossin" rel="noopener noreferrer">Benno Lossin</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-3977436014" rel="noopener noreferrer">2026-02-28 的评论</a></p>
<blockquote>
<p>语言实验的第一个 PR 刚刚合并：rust-lang/rust#152730</p>
<p>此 PR 启用了使用 <code>field_of!</code> 宏为结构体、枚举变体、元组或联合体的每个字段获取唯一类型。我们称这些类型为字段表示类型（Field Representing Types，FRT）。当基础类型不是 <code>repr(packed)</code> 且仅包含 <code>Sized</code> 字段的结构体时，此类型会自动实现 <code>Field</code> trait，该 trait 向类型系统公开一些关于字段的信息：从结构体起始处的偏移量（以字节为单位）、字段类型以及基础类型。</p>
<p>该特性仍不完整且高度实验性。我们也希望在未来的 PR 中解决其局限性。目前，这足以让我们能够实验字段投影的库版本，并编写对结构体字段泛型的函数。例如，可以编写如下代码：</p>
<pre><code><span><span>#</span><span>!</span><span>[</span><span>feature</span><span>(</span><span>field_projections</span><span>)</span><span>]</span></span>
<span></span>
<span><span>use</span><span> std</span><span>::</span><span>field</span><span>::</span><span>{</span><span>Field</span><span>,</span><span> field_of</span><span>}</span><span>;</span></span>
<span><span>use</span><span> std</span><span>::</span><span>ptr</span><span>;</span></span>
<span></span>
<span><span>fn</span><span> project_ref</span><span>&lt;</span><span>'</span><span>a</span><span>,</span><span> T</span><span>,</span><span> F</span><span>:</span><span> Field</span><span>&lt;</span><span>Base</span><span> =</span><span> T</span><span>&gt;</span><span>&gt;</span><span>(</span><span>r</span><span>:</span><span> &amp;</span><span>'</span><span>a</span><span> T</span><span>)</span><span> -&gt;</span><span> &amp;</span><span>'</span><span>a</span><span> F</span><span>::</span><span>Type</span><span> {</span></span>
<span><span>    //</span><span> SAFETY: the `Field` trait guarantees that this is sound.</span></span>
<span><span>unsafe</span><span> {</span><span> &amp;</span><span>*</span><span>ptr</span><span>::</span><span>from_ref</span><span>(</span><span>r</span><span>)</span><span>.</span><span>byte_add</span><span>(</span><span>F</span><span>::</span><span>OFFSET</span><span>)</span><span>.</span><span>cast</span><span>(</span><span>)</span><span> }</span></span>
<span><span>}</span></span>
<span></span>
<span><span>struct</span><span> Struct</span><span> {</span></span>
<span><span>field</span><span>:</span><span> i32</span><span>,</span></span>
<span><span>other</span><span>:</span><span> u32</span><span>,</span></span>
<span><span>}</span></span>
<span></span>
<span><span>fn</span><span> main</span><span>(</span><span>)</span><span> {</span></span>
<span><span>let</span><span> s</span><span> =</span><span> Struct</span><span> {</span><span> field</span><span>:</span><span> 42</span><span>,</span><span> other</span><span>:</span><span> 24</span><span> }</span><span>;</span></span>
<span><span>let</span><span> r</span><span> =</span><span> &amp;</span><span>s</span><span>;</span></span>
<span><span>let</span><span> field</span><span> =</span><span> project_ref</span><span>::</span><span>&lt;</span><span>_</span><span>,</span><span> field_of!</span><span>(</span><span>Struct</span><span>,</span><span> field</span><span>)</span><span>&gt;</span><span>(</span><span>r</span><span>)</span><span>;</span></span>
<span><span>let</span><span> other</span><span> =</span><span> project_ref</span><span>::</span><span>&lt;</span><span>_</span><span>,</span><span> field_of!</span><span>(</span><span>Struct</span><span>,</span><span> other</span><span>)</span><span>&gt;</span><span>(</span><span>r</span><span>)</span><span>;</span></span>
<span><span> println!</span><span>(</span><span>"</span><span>field: </span><span>{</span><span>field</span><span>}</span><span>"</span><span>)</span><span>;</span><span> //</span><span> prints 42</span></span>
<span><span> println!</span><span>(</span><span>"</span><span>other: </span><span>{</span><span>other</span><span>}</span><span>"</span><span>)</span><span>;</span><span> //</span><span> prints 24</span></span>
<span><span>}</span></span></code></pre>
<p><code>field_of!</code> 返回的类型的一个非常重要的特性是，如果你拥有基础类型，你可以为它们实现 trait。这允许通过扩展 <code>Field</code> trait 来用信息注释字段。例如，这允许编码结构固定字段的属性：</p>
<pre><code><span><span>use</span><span> std</span><span>::</span><span>pin</span><span>::</span><span>Pin</span><span>;</span></span>
<span></span>
<span><span>unsafe</span><span> trait</span><span> PinnableField</span><span>:</span><span> Field</span><span> {</span></span>
<span><span>    type</span><span> StructuralRefMut</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span></span>
<span><span>    where</span></span>
<span><span>        Self</span><span>::</span><span>Type</span><span>:</span><span> '</span><span>a</span><span>,</span></span>
<span><span>        Self</span><span>::</span><span>Base</span><span>:</span><span> '</span><span>a</span><span>;</span></span>
<span></span>
<span><span>    fn</span><span> project_mut</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span><span>(</span><span>base</span><span>:</span><span> Pin</span><span>&lt;</span><span>&amp;</span><span>'</span><span>a</span><span> mut</span><span> Self</span><span>::</span><span>Base</span><span>&gt;</span><span>)</span><span> -&gt;</span><span> Self</span><span>::</span><span>StructuralRefMut</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span></span>
<span><span>    where</span></span>
<span><span>        Self</span><span>::</span><span>Type</span><span>:</span><span> '</span><span>a</span><span>,</span></span>
<span><span>        Self</span><span>::</span><span>Base</span><span>:</span><span> '</span><span>a</span><span>;</span></span>
<span><span>}</span></span>
<span></span>
<span><span>fn</span><span> project_pinned</span><span>&lt;</span><span>'</span><span>a</span><span>,</span><span> T</span><span>,</span><span> F</span><span>&gt;</span><span>(</span><span>r</span><span>:</span><span> Pin</span><span>&lt;</span><span>&amp;</span><span>'</span><span>a</span><span> mut</span><span> T</span><span>&gt;</span><span>)</span><span> -&gt;</span><span> &lt;</span><span>F</span><span> as</span><span> PinnableField</span><span>&gt;</span><span>::</span><span>StructuralRefMut</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span></span>
<span><span>where</span></span>
<span><span>    F</span><span>:</span><span> PinnableField</span><span>&lt;</span><span>Base</span><span> =</span><span> T</span><span>&gt;</span><span>,</span></span>
<span><span>{</span></span>
<span><span>    F</span><span>::</span><span>project_mut</span><span>(</span><span>r</span><span>)</span></span>
<span><span>}</span></span></code></pre>
<p>然后我们可以为结构体的所有字段实现这个额外的 trait（并通过过程宏自动化）：</p>
<pre><code><span><span>unsafe</span><span> impl</span><span> PinnableField</span><span> for</span><span> field_of!</span><span>(</span><span>Struct</span><span>,</span><span> field</span><span>)</span><span> {</span></span>
<span><span>    type</span><span> StructuralRefMut</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span><span> =</span><span> &amp;</span><span>'</span><span>a</span><span> mut</span><span> i32</span><span>;</span></span>
<span></span>
<span><span>    fn</span><span> project_mut</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span><span>(</span><span>base</span><span>:</span><span> Pin</span><span>&lt;</span><span>&amp;</span><span>'</span><span>a</span><span> mut</span><span> Self</span><span>::</span><span>Base</span><span>&gt;</span><span>)</span><span> -&gt;</span><span> Self</span><span>::</span><span>StructuralRefMut</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span></span>
<span><span>    where</span></span>
<span><span>        Self</span><span>::</span><span>Type</span><span>:</span><span> '</span><span>a</span><span>,</span></span>
<span><span>        Self</span><span>::</span><span>Base</span><span>:</span><span> '</span><span>a</span><span>,</span></span>
<span><span>    {</span></span>
<span><span>        let</span><span> base</span><span> =</span><span> unsafe</span><span> {</span><span>Pin</span><span>::</span><span>into_inner_unchecked</span><span>(</span><span>base</span><span>)</span><span> }</span><span>;</span></span>
<span><span>        &amp;</span><span>mut</span><span> base</span><span>.</span><span>field</span></span>
<span><span>    }</span></span>
<span><span>}</span></span>
<span></span>
<span><span>unsafe</span><span> impl</span><span> PinnableField</span><span> for</span><span> field_of!</span><span>(</span><span>Struct</span><span>,</span><span> other</span><span>)</span><span> {</span></span>
<span><span>    type</span><span> StructuralRefMut</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span><span> =</span><span> Pin</span><span>&lt;</span><span>&amp;</span><span>'</span><span>a</span><span> mut</span><span> u32</span><span>&gt;</span><span>;</span></span>
<span><span>    //</span><span> u32 is `Unpin`, so this isn't doing anything special, but it highlights the pattern.</span></span>
<span></span>
<span><span>    fn</span><span> project_mut</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span><span>(</span><span>base</span><span>:</span><span> Pin</span><span>&lt;</span><span>&amp;</span><span>'</span><span>a</span><span> mut</span><span> Self</span><span>::</span><span>Base</span><span>&gt;</span><span>)</span><span> -&gt;</span><span> Self</span><span>::</span><span>StructuralRefMut</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span></span>
<span><span>    where</span></span>
<span><span>        Self</span><span>::</span><span>Type</span><span>:</span><span> '</span><span>a</span><span>,</span></span>
<span><span>        Self</span><span>::</span><span>Base</span><span>:</span><span> '</span><span>a</span><span>,</span></span>
<span><span>    {</span></span>
<span><span>        let</span><span> base</span><span> =</span><span> unsafe</span><span> {</span><span>Pin</span><span>::</span><span>into_inner_unchecked</span><span>(</span><span>base</span><span>)</span><span> }</span><span>;</span></span>
<span><span>unsafe</span><span> {</span><span>Pin</span><span>::</span><span>new_unchecked</span><span>(</span><span>&amp;</span><span>mut</span><span> base</span><span>.</span><span>other</span><span>)</span><span> }</span></span>
<span><span>    }</span></span>
<span><span>}</span></span></code></pre>
<p>现在，通过调用 <code>project_pinned</code> 函数并提供正确的 FRT，你可以安全地获取指向 <code>other</code> 的固定可变引用和指向 <code>field</code> 的普通可变引用。</p>
<p>（<a href="https://play.rust-lang.org/?version=nightly&amp;mode=debug&amp;edition=2024&amp;gist=5b9494bd8f88aa4adf054f70abe16d9d" rel="noopener noreferrer">playground 链接</a>）</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BennoLossin" rel="noopener noreferrer">Benno Lossin</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-4099385451" rel="noopener noreferrer">2026-03-20 的评论</a></p>
<blockquote>
<h3 id="plan-for-2026"><a href="#plan-for-2026" rel="noopener noreferrer"></a>
2026 年计划</h3>
<p>我们为这个目标制定了2026年的更新计划，包括三个主要步骤：</p>
<ul>
<li><code>a-mir-formality</code>、</li>
<li>实现、</li>
<li>实验。</li>
</ul>
<p>其中一些子任务依赖于其他步骤的其他子任务。你可以在<a href="https://github.com/rust-lang/rust/issues/145383" rel="noopener noreferrer">更新后的跟踪议题</a>中找到详情。以下是简要概述：</p>
<p><strong><code>a-mir-formality</code>：</strong> 我们希望为我们提出的借用检查器更改创建一个形式化模型以确保正确性。我们还希望创建一个文档，用更人性化的语言解释我们的模型。要真正开始这方面的工作，我们受阻于 Niko 正在开发的新的基于表达式的语法。</p>
<p><strong>实现：</strong> 同时，我们可以开始在编译器中实现更多部分。我们将继续改进 FRT，同时记住如果它们最终变得不必要，我们可能会移除它们。它们仍然是一个有用的特性，但可能正交于字段投影。我们计划进行小的增量更改，从库添加开始。我们还想开始探索潜在的脱糖，为此我们将添加一些手动和低级宏。当我们弄清楚这些后，我们可以快速推进语法更改。当我们有了足够成熟的形式化借用检查器集成模型后，我们将把它移植到编译器。经过进一步评估，我们可以考虑移除 <code>incomplete_feature</code> 标志。</p>
<p><strong>实验：</strong> 在每个编译器或标准库更改之后，我们会寻找几个项目在实际代码中压力测试我们的想法。我将负责 Linux 内核中的实验，而 <a href="https://github.com/tmandry" rel="noopener noreferrer">Tyler Mandry</a> 将用 <code>crubit</code> 测试字段投影。 <a href="https://github.com/joshtriplett" rel="noopener noreferrer">Josh Triplett</a> 也热衷于在标准库中引入它们；我将与他和 t-libs-api 的其他成员协调在那里进行实验。</p>
</blockquote>
</li>
<li>
<p><strong><a href="https://github.com/BennoLossin" rel="noopener noreferrer">Benno Lossin</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/390#issuecomment-4178384770" rel="noopener noreferrer">2026-04-02 的评论</a></p>
<blockquote>
<p>昨天，我们就我们当前的方法举行了一次 t-lang 设计会议。 <a href="https://github.com/Nadrieril" rel="noopener noreferrer">Nadrieril</a> 和我撰写了一份<a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg" rel="noopener noreferrer">设计文档</a>，并征求了 <a href="https://github.com/tmandry" rel="noopener noreferrer">Tyler Mandry</a>、<a href="https://github.com/dingxiangfei2009" rel="noopener noreferrer">Ding Xiang Fei</a>、<a href="https://github.com/Darksonn" rel="noopener noreferrer">Alice Ryhl</a> 和 <a href="https://github.com/nbdd0121" rel="noopener noreferrer">Gary Guo</a> 的反馈。在本文档中，我们提供了此特性的动机、适合 Rust 现有特性的解决方案的外观和感觉，以及基于虚拟位置的我们当前方法的综合且简洁的介绍。</p>
<p>总体反响非常积极。以下是一些会议上的具体引用：</p>
<ul>
<li>Josh：
<blockquote>
<p>我太喜欢这个了！我爱它的正交性，以及它的影响力和普遍性。我预计这将成为 Rust 的一个备受喜爱、<em>无处不在</em>的特性。</p>
<p>位置和投影对我来说似乎足够重要，值得为我们珍贵的剩余 ASCII 符号之一赋予一个，而 <code>@</code> 很好地让人联想到位置（某物在<em>某个位置</em>）。因此，如果最终的语法受益于一个符号，:+1: 将这个给 <code>@</code>。（不过，请看下面对细节的反馈。）</p>
</blockquote>
</li>
<li>TC：
<blockquote>
<p>喜欢它。高概念。正如我在上次会议上所说：</p>
<blockquote>
<p>我特别喜欢那些减少库表面区域需求的语言特性，这就是其中之一。</p>
</blockquote>
<p>当然，还有许多细节需要解决和进一步理解，例如关于迁移问题、与 <code>const</code>、<code>async</code> 和其他类似效果的事物交互等。我期待看到形式化工作。</p>
</blockquote>
</li>
<li>tmandry：
<blockquote>
<p>我喜欢这个方向的原因在于它如何有效地建立在 Rust 已有的基础上。我乐于看到在加强现有概念的同时，推动它们朝着更具表达力的方向发展的设计。</p>
</blockquote>
</li>
<li>Jack：
<blockquote>
<p>哇。这太棒了。这里有太多东西，我甚至不知道从何说起，该评论什么。我认为这种东西，我们只有在进行了一定量的实验之后，才能真正弄清楚细节和人体工学。</p>
</blockquote>
</li>
</ul>
<p>这次会议的一些要点：</p>
<ul>
<li>Mark <a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#From-author-Concerns-about-moving-forward" rel="noopener noreferrer">提出了一个担忧</a>，即 t-libs 应该更多地参与审查我们打算添加的实验性 trait。确保我们不会意外地稳定化或暴露某些行为，对我们的实验性 trait 有足够的文档，并且 t-libs 总体上了解此特性。
<ul>
<li>Mark 主动提出审查 PR，我将在那些 PR 中标记他。</li>
</ul>
</li>
<li>Jack <a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Jack" rel="noopener noreferrer">提出了一个担忧</a>，即应该避免增加 95% 用例的认知负荷。用户在 <code>@</code> 和 <code>&amp;</code> 之间做出正确选择可能具有挑战性。
<ul>
<li>我们<a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#From-author-Ergonomics-of-raw-pointers" rel="noopener noreferrer">在会议上更深入地讨论了这一点</a>，并得出结论，我们需要进行一些实验，可能利用用户研究团队。我们当然会记住这一点，并在我们有了部分工作实现后重新审视它。</li>
</ul>
</li>
<li>TC 要求我们发布我们精细的设计公理，本质上是我们考虑提案修改时所经历的事情列表。
<ul>
<li>我将就此事发布更新，详细说明这些内容。</li>
</ul>
</li>
</ul>
<p>除了担忧和可直接执行的项目，会议还涵盖了我们希望在未来几周/几个月研究的设计问题/评论：</p>
<ul>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Support-ReadWrite-of-non-PlaceTarget" rel="noopener noreferrer">我们能支持不同类型的读/写吗？</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Re-assembling" rel="noopener noreferrer">我们能支持包装类型的重新组装吗，例如从 <code>Cell&lt;[T]&gt;</code> 到 <code>[Cell&lt;T&gt;]</code>？</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Trait-for-reading-discriminant-for-pattern-matching" rel="noopener noreferrer"><code>PlaceDiscriminant</code> trait 需要精心设计</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Name-conflicts" rel="noopener noreferrer">我们如何处理命名冲突并确保实现我们 trait 的库类型的 SemVer 演进？</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Projecting-through-Option-and-Result" rel="noopener noreferrer">我们能支持通过 <code>Option</code> 投影吗，例如将 <code>&amp;Option&lt;Struct&gt;</code> 转换为 <code>Option&lt;&amp;Field&gt;</code>？</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Projecting-through-Option-and-Result" rel="noopener noreferrer">我们能支持携带对齐信息的指针并在投影时更新它吗？</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#Projecting-through-Option-and-Result" rel="noopener noreferrer">我们需要或希望支持哪些与效果（effects）的兼容性？</a></li>
<li><a href="https://hackmd.io/H5d2-83ER2ymNPZVIWCYWg?view#What-doors-are-we-closing" rel="noopener noreferrer">通过拥有字段投影，我们关闭了指针未来人体工学改进的哪些大门？</a></li>
</ul>
<p>感谢所有参加会议的人！</p>
</blockquote>
</li>
</ul>
</details>
<h3 id="reborrow-traits"><a href="#reborrow-traits" rel="noopener noreferrer"></a>
<a href="https://github.com/rust-lang/rust-project-goals/issues/399" rel="noopener noreferrer">Reborrow traits</a></h3>
<ul>
<li><strong>参与人员：</strong> <strong><a href="https://github.com/aapoalas" rel="noopener noreferrer">Aapo Alasuutari</a></strong></li>
<li><strong>倡导者：</strong> <a href="http://github.com/rust-lang/compiler-team" rel="noopener noreferrer">compiler</a> (<a href="https://github.com/oli-obk" rel="noopener noreferrer">Oliver Scherer</a>)， <a href="http://github.com/rust-lang/lang-team" rel="noopener noreferrer">lang</a> (<a href="https://github.com/tmandry" rel="noopener noreferrer">Tyler Mandry</a>)</li>
<li><strong>状态：</strong> <a href="https://rust-lang.github.io/rust-project-goals/2026/reborrow-traits.html" rel="noopener noreferrer">已延续</a></li>
</ul>
<details>
<summary>提供 1 项详细更新。</summary>
<ul>
<li>
<p><strong><a href="https://github.com/aapoalas" rel="noopener noreferrer">Aapo Alasuutari</a></strong> — <a href="https://github.com/rust-lang/rust-project-goals/issues/399#issuecomment-3977652772" rel="noopener noreferrer">2026-02-28 的评论</a></p>
<blockquote>
<p><a href="https://github.com/rust-lang/rust/pull/151753" rel="noopener noreferrer">PR</a> 已打开，以获取 <code>Reborrow</code> 和 <code>CoerceShared</code> traits 的第一个工作版本合并。</p>
<h3 id="blockers"><a href="#blockers" rel="noopener noreferrer"></a>
阻塞问题</h3>
<p>目前“阻塞”于 PR 审查，当然还有我和丁的所有审查问题修复工作。</p>
<p>审查带来了一个机会，可以用更通用的变体替换 <code>Rvalue::Ref</code> / <code>ExprKind::Ref</code>，该变体可以同时涵盖引用和用户定义的引用。这将是强大的，但这将是一个非常大且可怕的更改。如果这最终成为审查者的阻塞问题，那么该目标将在可预见的未来被阻塞，因为 PR 然后开始大规模重构。</p>
<h3 id="help-wanted"><a href="#help-wanted" rel="noopener noreferrer"></a>
寻求帮助</h3>
<p>当前 PR 不包含派生 trait，但我们非常需要它们。代替这些：</p>
<pre><code><span><span>impl</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span><span> Reborrow</span><span> for</span><span> CustomMarker</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span><span> {</span><span>}</span></span>
<span><span>impl</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span><span> CoerceShared</span><span>&lt;</span><span>CustomMarkerRef</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span><span>&gt;</span><span> for</span><span> CustomMarker</span><span>&lt;</span><span>a</span><span>'</span><span>&gt;</span><span> {</span><span>}</span></span>
<span></span>
<span><span>impl</span><span>&lt;</span><span>'</span><span>a</span><span>,</span><span> T</span><span>&gt;</span><span> Reborrow</span><span> for</span><span> CustomMut</span><span>&lt;</span><span>'</span><span>a</span><span>,</span><span> T</span><span>&gt;</span><span> {</span><span>}</span></span>
<span><span>impl</span><span>&lt;</span><span>'</span><span>a</span><span>,</span><span> T</span><span>&gt;</span><span> CoerceShared</span><span>&lt;</span><span>CustomRef</span><span>&lt;</span><span>'</span><span>a</span><span>,</span><span> T</span><span>&gt;</span><span>&gt;</span><span> for</span><span> CustomMut</span><span>&lt;</span><span>a</span><span>'</span><span>,</span><span> T</span><span>&gt;</span><span> {</span><span>}</span></span></code></pre>
<p>我们更喜欢有类似这样的东西：</p>
<pre><code><span><span>#</span><span>[</span><span>derive</span><span>(</span><span>Reborrow</span><span>,</span><span> CoerceShared</span><span>(</span><span>CustomMarkerRef</span><span>)</span><span>)</span><span>]</span></span>
<span><span>struct</span><span> CustomMarker</span><span>&lt;</span><span>'</span><span>a</span><span>&gt;</span><span> {</span><span> ...</span><span> }</span></span>
<span></span>
<span><span>#</span><span>[</span><span>derive</span><span>(</span><span>Reborrow</span><span>,</span><span> CoerceShared</span><span>(</span><span>CustomRef</span><span>)</span><span>)</span><span>]</span></span>
<span><span>struct</span><span> CustomMut</span><span>&lt;</span><span>'</span><span>a</span><span>,</span><span> T</span><span>&gt;</span><span> {</span><span> ...</span><span> }</span></span></code></pre>
<p>如果有人有兴趣接手这个话题，那就太棒了：派生宏实际上不需要执行任何有效性检查，因为 trait 本身会做到这一点。</p>
<p>如果 PR 很快合并，那么公开测试和探索这些 trait 将是下一件大事。很可能与此同时，进行泛化 <code>Rvalue::Ref</code> / <code>ExprKind::Ref</code> 的大规模重构。</p>
</blockquote>
</li>
</ul>
&lt;/</details><p><em>由 mimo-v2.5 模型翻译，花费 76158 tokens</em></p>]]></content:encoded>
      <link>https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/</link>
      <guid isPermaLink="false">https://blog.rust-lang.org/2026/05/18/project-goals-2026-04/</guid>
      <pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate>
    </item>
  </channel>
</rss>
