Rust 2024 Edition 即将发布!

2024 Rust Web框架的选择与最佳实践 随着Rust语言在系统编程领域的崛起,它的安全性、性能和并发特性也吸引了Web开发者的关注。本文将深入探讨当前流行的Rust Web框架,分析它们的特点、优势以及如何在Web开发中进行选择和使用。同时,我们还将提供一些实际的示例,帮助读者更好地理解和应用这些框架。 阅读详情
AI摘要

Rust 2024 Edition 即将在二月稳定发布。该版本有诸多变更,如范围变更、不安全代码规则调整、捕获生命周期信息改进等,还对Cargo及语言本身有小改动。虽有大量不兼容变更,但可自动迁移代码,不过部分项目可能会选择停留在2021版。

关注了就能看到更多这么棒的文章哦~

The Rust 2024 Edition takes shape

By Daroc Alden
January 24, 2025
Gemini-1.5-flash translation
https://lwn.net/Articles/1002456/

去年,LWN介绍了Rust 2024 版本(Edition)中计划要做的改动。现在,随着该版本即将在二月份稳定发布,是时候回顾一下版本的迭代过程,看看哪些变更成功落地,又有哪些新的改动被添加进来,以及还有哪些工作有待完成。令人惊讶的是,在过去的一年中,大量的新的工作被提出、实现并稳定化。

版本(Editions)是 Rust 确保稳定性的机制,它能够应对语言频繁的小版本发布以及快速发展的现状。每个版本都代表着一个向后兼容性保证:一旦版本最终确定,那么在这个版本上可以编译的代码将始终在这个版本上可以编译。版本并非完全冻结——只要向后兼容,语言仍然可以添加新特性——但该项目非常重视向后兼容性承诺。编译器的新版本会在大多数发布的 Rust 代码(在crates.io上)和 Rust for Linux 内核代码上进行测试,以确保它们不会破坏为旧版本编写的代码。

因此,新的版本的引入代表着语言引入不兼容变更的唯一机会。在过去的一年里,积累了相当数量的此类变更,从对语法的细微调整,到如何解释类型系统中某些类型的解读方式等重大变更。虽然这些变更中没有一项需要 Rust 项目立即采用,但在编写 Rust 代码时,我们需要注意这些变更。

范围变更

长期以来,Rust 程序员一直被一个问题困扰,那就是该语言如何处理临时值的生命周期。例如,`if let` 结构可以供程序员设置临时值。然而,在当前版本的 Rust 中,它有一个令人讨厌的特性:它会将参与匹配的任何临时值持续保持住,直到相应的`else`块之后。例如,在以下代码中,`std::sync::Mutex`会在`else`分支中保持锁定(locked)状态:

if let Some(x) = mutex.lock().some_method() {    ...} else {    // Mutex remains locked here}

对这一点进行改变,就是一个向后不兼容的变更,因为 Rust 程序可能对其被丢弃的顺序很敏感。具体来说,任何依赖于`mutex`在`else`块中保持 lock 状态的程序,如果 Rust 语言规范更改为更早地丢弃该临时值,则会导致程序逻辑出错。该变更即将在2024版本中启用,同时还将添加一个 lint 规则来警告程序员受到影响的程序。

该项目还修复了块末尾临时表达式的清理顺序。Rust 块具有返回值,这使得`if`语句可以用作表达式,或者用作其他一些情况。但是,当从块返回表达式时,它可能会创建临时值。例如,以下代码为`cell.borrow()`创建了一个临时值:

fn f() -> usize {    let cell = RefCell::new("..");    // The borrow checker throws an error for the below    // line in the 2021 edition, but not the 2024 edition    cell.borrow().len()}

目前,该临时值在块中的局部变量(在本例中仅为`cell`)被丢弃后就马上被丢弃。这有些不方便,因为它意味着上述代码会被生命周期检查器拒绝,因为使用`cell`的地方存活的时间比`cell`本身更长。程序员必须通过显式地将任何临时变量赋值给变量来解决这个问题,这会使用不必要的`let`语句使代码混乱。因此,2024 版本将通过确保块末尾的临时变量在局部变量之前被丢弃来解决这个问题。

不安全代码

将针对不安全函数中的不安全操作发出新的警告。在当前版本的 Rust 中,将函数标记为`unsafe`实际上混淆了`unsafe`关键字的两种含义:它既将函数标记为不安全调用,又允许程序员在函数体中使用不安全操作。虽然这在直觉上是有道理的,但 Rust 程序员普遍发现它会导致混淆,因为它可能使难以发现函数体中哪些操作实际上是不安全的。在新版本中,在不使用额外的`unsafe`块标记用法的`unsafe`函数中使用不安全操作将导致警告。

然而,本版本对`unsafe`规则的最大更改在于该语言如何处理`extern`块(它声明可以使用 C 外部函数接口调用的外部函数)。目前,所有外部函数都被视为不安全的,因为 C 代码可能执行任何操作。对于实际上安全调用的简单函数来说,这有点不符合人体工程学。但是,仅仅让程序员断言某些外部函数是安全的将会破坏 Rust 的承诺:当出现未定义行为时,必须有一个或多个不正确的`unsafe`块负责。

语言开发者采用的解决方案是`unsafe extern`块。现在,整个`extern`声明将被标记为不安全——从而用户会得到应有的警告,即他们必须确保所有外部函数声明(包括每个函数的安全性)都是正确的,否则将面临未定义行为的风险。由于该警告已移动到声明处,因此使用外部函数不再一定需要使用`unsafe`块(尽管程序员仍然可以显式地将外部函数标记为不安全)。实际上,由于许多 Rust 项目使用自动生成的 C 绑定,因此可能没有多少区别。即使该更改还会增加追踪任何有问题的 unsafe 代码的间接步骤,它也会减少用于调用外部函数的不必要的`unsafe`块的数量。

该版本还将使std::env::set_var()和std::env::remove_var()环境变量操作函数不安全,因为它们只应该在单线程环境中使用,但是它们的类型中没有任何内容强制执行这一点。类似地,该版本将要求`no_mangle`属性(它禁用名称修饰)被标记为不安全,因为它如果存在两个同名函数,则可能会导致在某些平台上调用错误的函数实现。它也将不再允许获取对全局可变变量的引用——相反,必须使用不安全块中的原始指针来操作它们。

捕获生命周期信息

LWN 已经报道过改进推断函数返回类型(inferred function return types)可用性的工作,自该文章发表以来,这项工作并没有停止。简要回顾一下:Rust 编译器允许程序员声明函数返回某个 trait 的`impl Trait`,编译器将自动推断函数应该返回哪个具体的类型。这是一种存在类型,对于返回复杂迭代器的函数特别有用,这些迭代器具有复杂的类型,让用户写出来的话就显得很多余。Rust 开发者将此特性称为“return-position impl Trait”(RPIT)类型。

当此特性必须与 Rust 的生命周期系统配合起来时,问题就出现了。如果编译器推断出的类型包含具有给定生命周期的引用,则之前的 Rust 版本无法让程序员“命名”该生命周期,因此程序员也无法向其添加任何边界。这对于经常需要保存具有复杂生命周期的引用的异步函数来说尤其成问题。为了解决这个问题,该语言添加了一个新的语法部分,允许程序员命名在`impl Trait`类型中使用的生命周期。例如,此函数明确指出生命周期'a 被(隐式)返回类型引用,允许程序员根据需要使用名称处理生命周期:

fn example<'a>(one: &'a Foo, two: &Bar) -> impl use<'a> Sized {    ...}

`use`块中未提及的任何生命周期都不会被捕获,因此在上面的示例中,`two`仅在函数内部使用,而不是存储在其返回类型中。这解决了 RPIT 类型的主要问题之一,并且是改进异步函数体验的一大步,这是 Rust 项目 2024 年的目标之一。但`impl Trait`类型的语义目前有点不一致。当存在`use`块时,返回类型捕获的生命周期和泛型类型参数都必须显式列出。当不存在`use`块时,泛型类型参数会被隐式捕获,但生命周期参数不会(因为这可以通过给它们命名来避免整个问题)。

为了使`impl Trait`类型更加一致,该语言的 2024 版本将对生命周期参数和泛型类型参数使用相同的规则:默认情况下,它们将被隐式捕获,如果程序员想要为它们命名(或仅捕获其中一部分),则必须使用`use`块。

小的变更

Cargo(Rust 的包管理器和构建系统)也有一些变化。最大的一项是它将很快支持选择具有兼容最小支持 Rust 版本的依赖项。因此,例如,声明支持 Rust 版本 1.76 的库将不再能够基于仅声明支持 Rust 版本 1.80 的库运行。这将解决维护人员的许多难题。

还有许多对语言的细微更改,这些更改不太可能需要更改现有代码:

  • `Future`和`IntoFuture`特性将无需导入即可使用。

  • 声明宏匹配语法片段的规则正在调整,并变得更加严格。

  • Rustdoc 测试应该运行更快。

  • Rust 的代码格式化程序将以不同的方式对导入进行排序(参见问题124764、123800和123802),并支持多个版本。

  • `gen`关键字(将用于指示生成器)已保留供将来使用,无保护的前缀字符串字面量也是如此。

  • “never”类型(`!=`)将不那么特殊。

  • 程序员将能够迭代装箱切片(iterate through boxed slices)。

尽管有大量的向后不兼容的更改即将在这个版本中发布,但适应这个版本应该不会太难。任何为版本提出的更改的要求之一是,必须有一种方法可以自动迁移现有代码。任何使用 Cargo 的 Rust 项目都应该能够运行`cargo fix –edition`,然后更新其`Cargo.toml`文件中的版本声明以进行升级。一些自动修复有点难看(或引入了新的`unsafe`块),因此该过程并非完全没有痛苦。但是,由于 Rust 会愉快地混合使用不同版本的库,因此许多项目会选择在一段时间内停留在 2021 版。

Rust 项目并没有完全实现它为2024年设定的所有目标(这或许解释了为什么 2024 版本将在 2025 年 2 月发布),但它取得了实质性进展。而且,尽管许多人担心语言复杂性的逐渐累积,但 2024 版本的计划表明,该项目愿意随着时间的推移简化和精简事物——尽管不像有些人希望的那样快。我们将在未来几年看看为 2027 版本提出了什么。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

9d2788eea8866298a11917fc811ae092.jpeg

Rust入门基础 Rust是一种通用的编程语言,它可以让每个人编写可靠且高效的软件。Rust可以用来替换C/C++,Rust和它们具有同样的性能,但是很多常见的bug在编译时就可以被消灭。Rust能够保证内存安全(无需GC),并且易于维护、调试,代码既安全又高效。 阅读详情

相关推荐

《Rust 版本指南》第五章:Rust 2024

Rust 2024版本引入了多项重要变更,涵盖语言特性、编译器和工具改进。主要更新包括: 语言层面: RPIT生命周期捕获规则变更,新增use<>约束语法 if let表达式临时作用域调整 模式匹配便利性限制增强 unsafe关键字要求扩展到extern块和特定属性 编译器: 标准库prelude新增Future和IntoFuture trait Never类型fallback行为变更 宏片段指定符支持const表达式 Cargo: 支持Rust版本感知的依赖解析 表和键名标准化 改进工作区依赖

北京锋通科技有限公司的技术blog 2196

Rust编程语言入门教程(一)-什么是Rust

Rust编程语言入门教程(一) 什么是Rust rust 发展历史 应用环境 为什么选择Rust 新项目用Rust还是Go?

西京刀客 2万+

rust教程 第一章 —— 初识rust

本文主要的目的就是认识一下rust这门语言的基本概念

余识- 5万+

【Rust日报】Rust稳定2024版本将于 2025年2月20日发布

fastembed-rs - AI嵌入库FastEmbed的Rust实现,提供了快速的文本嵌入、图像嵌入和候选项重新排序功能。它具有以下主要特性:支持同步使用,无需依赖Tokio。使用@pykeio/ort进行高性能的ONNX推理。使用@huggingface/tokenizers进行快速编码。支持使用@rayon-rs/rayon进行批量嵌入生成和并行计算。默认模型是Flag Embedding...

Rust语言学习交流 1629

避坑指南:Windows11语言包安装后部分界面仍显示中文的终极解决方案

本文详细解析了Windows11语言包安装后部分界面仍显示中文的问题,提供了从基础到进阶的完整解决方案。通过PowerShell命令、注册表清理和系统文件检查等方法,帮助用户彻底解决语言显示不一致的问题,确保系统界面语言统一。

weixin_29232507的博客 1635

Windows-Anaconda3+TensorFlow安装教程

测试环境:win10-64位和win7-64位 (系统必须是64位,因为TensorFlow目前只支持64位) 一、安装Anaconda3 1.下载Anaconda3 Anaconda官网链接:link 这里我们选择Windows版本,python3.6-version-64位,如下图所示。 2.下载完成之后,点击安装Anaconda3 注意:安装过程中要选择添加环境变量,如图 待安装完成...

DoctorCuiLab的博客 3086

Rust - RFC 3501 edition_2024

摘要 Rust计划在2024年推出新版本,并确立三年一次的版本发布节奏。RFC 3501修订了之前的版本发布流程,组建专门的项目组负责协调2024版的发布工作,包括制定时间表、筛选变更、测试迁移、文档更新等全流程管理。项目组将评估这一节奏的合理性,领导委员会保留调整权。该机制旨在平衡创新与稳定性,但可能面临变更延迟和发布压力等挑战,需要持续优化流程缓解。

764

TOPCon vs PERC:2024年光伏电站投资,哪种技术更划算?

本文深入分析了2024年光伏电站投资中TOPCon与PERC技术的财务表现。通过对比初始系统成本、全生命周期发电量及环境适应性,指出当前TOPCon组件与PERC价差已显著缩小,其更高的转换效率和更低的衰减率能有效降低度电成本并提升项目内部收益率,为投资者提供更具长期价值的方案。

p5l2m9n4o6q的博客 267

Rust 版本(Editions)机制全解:Edition 2015 / 2018 / 2021 / 2024 与 Cargo.toml 配置实战

Rust 采用「六周一发布的稳定版节奏 + 每三年左右一次 Edition 大版本聚合」的双轨演进策略,`cargo new` 生成项目时写入 `Cargo.toml` 的 `edition` 字段,正是告诉编译器使用哪套语言语义。本文以《The Rust Programming Language》附录 E 为骨架,结合本仓库([rust-lang/book](https://link.gitco

gitblog_00619的博客 209

数值计算方法 matlab用二分法或简单迭代法求_快速求解方程的根——二分法与牛顿迭代法

今天是周四高等数学专题的第7篇文章。之前的文章和大家聊了许多数学上的理论,今天和大家聊点有用的东西。我们都知道,工业上的很多问题经过抽象和建模之后,本质还是数学问题。而说到数学问题就离不开方程,在数学上我们可以用各种推算、公式,但是有没有想过在计算机领域我们如何解一个比较复杂的方程?如果之前没有想过,那你可能得想一想,因为以后很有可能会在面试题当中遇到。二分法我们要介绍的第一个方法是二分法。说到二...

weixin_39945915的博客 1304

RAGFlow本地部署遇阻:解析进度卡顿的排查与修复指南

本文针对RAGFlow本地部署中常见的文档解析进度卡顿问题,提供了详细的排查与修复指南。核心原因是模型下载网络受阻,解决方案是通过修改环境配置文件,将模型下载源切换至国内镜像站,从而快速解决解析停滞问题。

weixin_29297127的博客 341

comprehensive-rust 课程解读:Rust 生态核心工具链(rustc / cargo / rustup)与版本与 Edition 机制全解析

本篇文章以 Google 团队编写的 Rust 课程《Comprehensive Rust》(仓库根目录 [README.md](https://link.gitcode.com/i/d71ef009a30649b59c2dd6003f78f6d5))中 [Rust 生态章节](https://link.gitcode.com/i/0526e9de1085c9cb51ffe96a4f676f29)

gitblog_00577的博客 791

STM32F103多通道PWM输出避坑指南:TIM1_CH1异常输出的解决方案

本文深入解析STM32F103多通道PWM输出中的TIM1_CH1异常问题,提供从时钟配置到GPIO复用的系统化解决方案。通过黄金法则配置流程和高级调试技巧,帮助开发者快速定位并解决PWM输出不稳定、占空比异常等问题,同时拓展多定时器协同和互补PWM等高级应用场景。

weixin_29194817的博客 117

Neon 原生模块的 Rust 2024 Edition 实测:构建、交叉编译与项目结构解析(基于 test/rust-2024 示例)

本文以 neon 仓库中的 [test/rust-2024 示例](https://link.gitcode.com/i/1a6ac8e30387d1d0632fb2d1ea4f46ce) 为主体,讲解如何用 Rust 2024 Edition 编写、构建并运行一个基于 Neon 的 Node.js 原生模块。读完本文,你可以掌握该示例的完整构建流程(`npm run build` 背后的 car

gitblog_00907的博客 213

第33次CCF-CSP认证考试 第一题 词频统计 满分题解

本人小白一枚,抱着学习的态度想到网上找一些csp的参考答案,但由于实力有限,大佬的代码大都看不太懂,于是萌生了想用一些简单,基础的语句完成csp前两题的想法并公开,以便与像我这样实力不强的同学交流学习,如有更好的建议,还请斧正,感谢!

qq_75242106的博客 1869

SOME/IP协议详解「总目录」

SOME/IP系列文章总目录

雪云飞星的博客 2万+

PecoFence 5分钟上手教程:从创建第一个玻璃栅栏到自动整理桌面图标

PecoFence 是一款免费、开源的 Windows 11 桌面整理工具,可替代 Stardock Fences:它用玻璃栅栏收纳桌面图标,通过规则自动整理文件,还支持标签页、文件夹门户和 Peek 速览。本上手教程带你 5 分钟走完「下载安装 → 创建第一个玻璃栅栏 → 配置自动整理规则」的完整流程,让桌面图标从此各归其位。 [![PecoFence 玻璃栅栏桌面整理效果:项目文件夹、PDF

gitblog_00811的博客 780

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Rust 2024 Edition 新范围类型重构:`std::range::Range` 的 Copy 化设计全解析(RFC 3550)

Rust 的 `a..b`、`a..`、`a..=b` 是使用最频繁的语法之一,但在 2024 Edition 中它们将指向一套全新的类型:`std::range::Range`、`std::range::RangeFrom`、`std::range::RangeInclusive`。本指南以 RFC 3550([text/3550-new-range.md](https://link.gitco

gitblog_01015的博客 921

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Rust日报】Rust 1.85.0 及 Rust 2024 发布

Rust 1.85.0 及 Rust 2024 发布Rust 1.85.0 稳定版主要更新内容Rust 2024 版:Rust 2024 版正式稳定发布,它带来多项语言、标准库、Cargo、Rustdoc 和 Rustfmt 的更新,如改变 RPIT 生命周期捕获规则、调整临时变量作用域、增加Future和IntoFuture到标准库 prelude 等。用户可参考版本指南进行迁移,部分更改可使用...

Rust语言学习交流 1163

Rust Style Edition 样式演进机制解析:如何在不破坏兼容性的前提下演进 rustfmt 默认样式

本篇文章围绕 RFC 3338(style-evolution)展开,系统讲解 Rust 如何借助 edition 机制演进 rustfmt 的默认格式化样式,覆盖 `style_edition` 配置项、`--style-edition` 命令行参数、与 `edition` 的优先级关系、nightly 引入与稳定化节奏,以及样式指南的版本归档方案。读完本文,你将理解 style edition

gitblog_00352的博客 172

Rust RFC 3606 解读:Rust 2024 版尾表达式中的临时值生命周期

Rust 的临时值(temporary)生命周期规则,一直是借用检查器与日常开发体验之间最容易产生"出乎意料报错"的领域之一。本文以 [Rust RFC 3606](https://link.gitcode.com/i/1a413ce3db3e83219a63b204ab3cc5a3)(Feature Name: `shorter_tail_lifetimes`)为核心,完整解读这项将在 Rust

gitblog_00801的博客 225

Rust Project Goals 过程解析:从 RFC 3614 看 Rust 项目路线图机制的诞生与演进

RFC 3614(`text/3614-project-goals.md`)是 Rust 项目由「年度 Roadmap」转向「半年一轮的 Project Goals(项目目标)机制」的奠基性提案。它以 2024 下半年为试点,引入了「目标拥有者(owner)」「目标清单(goal slate)」「目标季(goal season)」等一整套可执行的过程设计。读完本文,你将理解这套机制的核心设计公理、

gitblog_00437的博客 206

《The Rust Programming Language》第 2 版前言导读:Rust 2021 Edition、版本兼容性与本书新特性

**前言导读**:这篇指南围绕 The Rust Programming Language(即《The Rust Programming Language》书籍,本仓库为 rust-lang/book 的开源镜像)的 Preface 展开,系统讲解本书在 Rust 2021 Edition 与 Rust 1.62.0 基线之上的撰写前提、2021 版语言改进对全书内容的具体影响、以及本书相较前版的

gitblog_06824的博客 224

Rust 2021 Edition 深度解析:RFC 3085 的版本机制、迁移工作流与实战指南

本篇文章以 RFC [3085-edition-2021.md](https://link.gitcode.com/i/5b62f3d96bbb6efb8bd1fe1c3e1de663) 为核心,系统讲解 Rust Edition 机制的定位、设计原则、参考级实现细节以及从 2018 迁移到 2021 的标准工具链工作流。读完本文,你将掌握 `cargo fix --edition` 的四步迁移流

gitblog_00957的博客 215

【Rust日报】Rust 2024年下半年项目目标

Rust 2024年下半年项目目标Rust 计划在 2024 年发布第四版 Rust,旨在解决一些小的使用问题,使 Rust 更易用,主要包含以下改进:异步 Rust:计划推出异步闭包和 Send 边界等关键功能,提升异步 Rust 的使用体验。Linux 内核中的 Rust:努力解决阻碍 Rust 在 Linux 内核中使用的不稳定特性,推动 Rust 在低级系统应用中的发展。其他目标:除了旗舰...

Rust语言学习交流 673

【Rust日报】Rust 2024 版本中的不兼容变更汇总

Rust 2024 版本中的不兼容变更汇总Rust 2024 版本已经发布,其中包含一些不兼容的变更,简单汇总如下:核心语言返回位置impl Trait生命周期捕获规则:在 2024 版本中,返回位置的impl Trait默认捕获所有生命周期,而 2021 版本默认不捕获。临时作用域更改:2024 版本调整了if let中临时变量的作用域,其在if分支结束时结束,避免了借用冲突;同时...

Rust语言学习交流 824
上一篇: LWN:2025年值得期待的那些事!
下一篇: LWN:6.14合并窗口第一部分!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值