跳转到主要内容
Chinese, Simplified

与 C、C++、Go 和您可能使用的其他语言相比,Rust 编程语言的独特方法可以生成更好的代码,并且妥协更少。 它还会定期更新,通常是每月更新一次。

在哪里下载最新的 Rust 版本
如果您已经通过 rustup 安装了以前版本的 Rust,您可以通过以下命令访问最新版本:

$ rustup update stable

Rust 1.58.1 中的新功能


该版本于 2022 年 1 月 20 日发布,就在 Rust 1.58 之后的几天,修复了 std::fs::remove_dir_all 标准库函数中的竞争条件。此漏洞在 CVE-2022-21658 中进行了跟踪,并发布了公告。攻击者可以利用此安全问题诱使特权程序删除攻击者无法访问或删除的文件和目录。 Rust 1.0 到 1.58 版本受此漏洞影响。建议用户更新他们的工具链并使用更新的编译器构建程序。

Rust 1.58.1 还解决了 Rust 1.58 中引入的诊断和工具中的几个回归问题:

  • non_send_fields_in_send_ty Clippy lint 被发现误报过多,已被移至名为“nursery”的实验性 lints 组。
  • useless_format Clippy lint 已更新以处理格式字符串中捕获的标识符,这是在 Rust 1.58 中引入的。
  • 修复了 Rustfmt 中的回归,防止生成的文件在通过标准输入时被格式化。
  • rustc 在某些情况下显示的错误消息已得到修复。


Rust 1.58 中的新功能


1 月 13 日宣布的 Rust 1.58 具有以格式字符串捕获的标识符。有了这个功能,格式字符串现在可以通过在字符串中写入 {ident} 来捕获参数。格式早已接受位置参数和命名参数,例如:

 

println!("Hello, {}!", get_person());     // implicit position
println!("Hello, {0}!", get_person());     // explicit index
println!("Hello, {person}!", person = get_person());     // named

现在,命名参数也可以从周围的范围中捕获。

Rust 1.58 中的另一个新功能:在 Windows 目标上,std::process::Command 将不再在当前目录中搜索可执行文件,这是 win32 CreateProcess API 历史行为的影响。 这修复了在处理不受信任的目录时搜索可能导致意外行为或恶意结果的情况。

Rust 1.58 还在标准库中引入了更多的#[must_use]。 #[must use] 属性可以应用于类型或函数,如果没有明确考虑它们或者它们的输出几乎可以肯定是一个错误。 Rust 1.58 还具有稳定的 API,例如 Metadata::is_symlinkcode 和 Path::is_symlink。

Rust 1.57 中的新功能


12 月 2 日发布的 Rust 1.57 带来了恐慌! (用于终止处于不可恢复状态的程序)到 const 上下文。以前,恐慌!宏在 const fn 和其他编译时上下文中不可用。现在这已经稳定下来。随着 panic! 的稳定化,其他几个标准库现在可以在 const 中使用,例如 assert!。但这种稳定性还不包括完整的格式化基础设施。恐慌!必须使用静态字符串或要与 {} 一起使用的单个插值来调用宏。预计这种支持将在未来扩大。

Rust 1.57 中的其他新功能和改进:

  • Cargo 增加了对任意命名配置文件的支持。
  • 对于 Vec、String、HashMap、HashSet 和 VecDeque,try_reserve 已经稳定。此 API 使调用者能够错误地为这些类型分配后备存储。
  • 其他多个 API 已稳定,包括 [T; N]::as_mut_slice 和 [T; N]::as_slice。
  • 宏属性现在可以跟随#derive 并且将看到原始输入。

Rust 1.56 中的新功能


10 月 21 日宣布,Rust 1.56 是支持 Rust 2021 版本的语言的第一个版本。 Rust 2021 版允许 Rust crate 作者选择中断语言更改,使 Rust 更易于使用和更一致。 crates 可以随时选择加入,并保持与旧版本中的 crates 的互操作性。 Rust 编译器支持该语言的所有三个版本:2015、2018 和 2021。

Rust 1.56 中的其他新功能包括:

  • 闭包中的不相交捕获,以简化闭包的编写。
  • Cargo.toml 现在支持 [package] [rust-version] 字段来指定 crate 支持的最低 Rust 版本,如果不满足,Cargo 将退出并出现早期错误。虽然目前这不会影响依赖解析器,但其目的是在兼容性问题变成隐秘的编译器错误之前捕获它们。
  • 支持 binding@pattern 中的新绑定。 Rust 模式匹配可以使用绑定整个值的单个标识符编写,然后是 @ 和更完善的结构模式,但直到现在才允许在该模式中进行其他绑定。此功能在 Rust 1.0 之前已被允许,但由于不健全而被删除。编译器团队现在已经确定这种模式在稳定的 Rust 中是安全且允许的。
  • 恐慌宏现在总是需要格式字符串,就像 printlin!()。
  • 许多 API 已经稳定,包括 std::os::unix::fs::chroot 和 UnsafeCell::raw_get。

Rust 1.55 中的新功能


2021 年 9 月 9 日宣布,Rust 1.55 提供更快、更正确的浮点解析。浮点解析的标准库实现已更新为使用 Eisel-Lemire 算法,这带来了速度和正确性的改进。以前,某些边缘情况无法解析,但现在已修复。

同样在 Rust 1.55 中:

  • 模式中开放范围的使用已经稳定。
  • 许多方法和特征实现已经稳定,包括 Bound::cloned 和 Drain::as_str。
  • Cargo 现在对编译器错误进行重复数据删除,并在编译结束时打印报告。以前,当运行 cargo test、cargo check ---所有目标或在多个配置中构建相同 Rust crate 的类似命令时,错误和警告可能会重复出现,因为 rustc 执行并行运行并显示相同的警告。


Rust 1.54 中的新功能


7 月 29 日发布,Rust 1.54 支持在属性中调用类似函数的宏。类函数宏可以是基于宏规则的宏!或者它们可以是过程宏,像宏一样调用!(…)。一个值得注意的用例是将其他文件中的文档包含到 Rust 文档注释中。

Rust 1.54 中的其他新特性:

  • wasm32 平台的一些内在函数已经稳定。这些可以访问 WebAssembly 中的 SIMD 指令。
  • 默认情况下重新启用增量编译。它在 Rust 1.52.1 中默认被禁用。在 Rust 1.52 中,在从磁盘缓存加载增量编译时添加了额外的验证,导致在验证将这些静默错误变为内部编译器错误 (ICE) 时发现了预先存在的潜在健全性问题。从那时起,已经完成了解决这些问题的工作,一些修复在 Rust 1.53 中登陆,大多数修复在 Rust 1.54 中。可能导致 ICE 的剩余问题在实践中被认为是罕见的。
  • 多种方法和特征实现已经稳定。
  • 编译器输出已针对调试 C++ 的 Windows MSVC 平台上的枚举进行了改进。

Rust 1.54 紧随 6 月 17 日发布的 Rust 1.53,其中包含语言和库功能,包括数组的 IntoIterator 实现。

Rust 1.52 中的新功能


在 5 月 6 日推出的 Rust 1.52 是通过对 Clippy 工具支持的增强来领导的,Clippy 是用于查找错误和改进 Rust 代码的 lint 集合。以前,运行 cargo check 后跟 cargo clippy 实际上不会运行 Clippy,Cargo 中的构建缓存不会区分两者。这已在 Rust 1.52 中修复。同样在 1.52 版本中,稳定了以下方法:

几个以前稳定的 API,包括 char::len_utf8 和 u8LLeq_ignore_ascii_case,现在都是 const。 对于编译器,默认 LLVM 已升级到 LLVM 12。该语言的后续版本 Rust 1.52.1 于 5 月 10 日发布,为增量编译中的错误提供了一种解决方法,该错误在 Rust 1.52 中成为编译器错误 .0. Rust 构建者建议升级到 1.52.1 或禁用增量编译。

Rust 1.51.0 中的新功能


发布于 2021 年 3 月 25 日,Rust 1.51.0 版本是相当长一段时间以来对语言和 Cargo 包管理器的最大补充之一,它稳定了 const 泛型的 MVP(最小可行产品)实现和新的功能解析器 货运是亮点之一。 其他亮点:

  • 使用 const generics MVP,为库设计者添加了一个用于开发编译时安全 API 的工具。一个备受期待的特性,const 泛型是泛型参数,其范围是常量值,而不是类型或生命周期。例如,这允许类型通过整数参数化。计划是逐步引入 const 泛型,因此目前唯一可以用作 const 泛型参数的类型是整数类型,包括 size、usize、char 和 bool。

  • 除了 const 泛型,还稳定了一个使用它的新 API,std::array::IntoIter,它允许开发人员在任何数组上创建按值迭代器。

  • 对于 Cargo,新的特征解析器引入了一种用于计算包特征的算法,以帮助避免与当前解析器的一些不必要的统一。

  • 改进了 MacOS 上的编译时间,改进了包含调试信息的构建速度并减少了使用的磁盘空间量。

  • 除了类型和生命周期之外,函数、特征和结构等项目还可以通过常量值进行参数化。

  • 稳定的 API,包括稳定切片和 Peekable 等类型的 18 种新方法。


Rust 1.50.0 中的新功能


发布于 2021 年 2 月 11 日,Rust 1.50.0 改进了数组索引,扩展了对联合字段的安全访问,并添加到标准库中。具体改进包括:

  • 对于 const 泛型数组索引,此版本继续向稳定的 const 泛型发展,为数组添加 ops::Index 和 IndexMut 的实现 [T; N] 对于任何长度的 Const N。索引运算符 [ ] 已经通过编译器对数组起作用,但在类型级别,数组直到现在才真正实现库特征。此外,正式承认在数组重复中稳定使用 const 值。

  • 允许对 ManuallyDrop<T> 联合字段进行安全分配。

  • 现在允许在 Unix 平台上使用 File。有了这个特性,Rust 中的某些类型对什么是有效值有限制,这可能无法涵盖可能的内存值范围。任何剩余的有效值都称为利基,该空间可用于类型布局优化。在 Unix 平台上,Rust 的 File 由系统的文件整数描述符组成;这恰好有一个可能的利基,因为它不能是-1!返回文件描述符的系统调用使用 -1 来指示发生了错误,因此 -1 永远不可能是真正的文件描述符。从 Rust 1.50 开始,它被添加到类型定义中,因此它也可以用于布局优化。因此,Option<File> 现在将具有与 File 相同的大小。

  • 对于 Cargo,添加了一个 [rustc-workspace-wrapper] 选项,以设置一个包装器来执行而不是 rustc,仅适用于工作区成员。此外,在 cargo update 命令中添加了 --workspace 标志。

  • 库中添加了九个新的稳定函数:bool::then、btree_map::Entry::or_insert_with_key、f32::clamp、f64::clamp、hash_map::Entry::or_insert_with_key、Ord::clamp、RefCell::take 、 slice::fill 和 UnsafeCell::get_mut。

  • 同样在库中,几个现有函数被设为 const:IpAddr::is_ipv4、IpAddr::is_ipv6、Layout::size、Layout::align、Layout::from_size_align、pow 用于所有整数类型、checked_pow 用于所有整数类型、saturating_pow对于所有整数类型,wrapping_pow 对于所有整数类型,next_power_of_two 对于所有无符号整数类型,checked_power_of_two 对于所有无符号整数类型。

 

原文:https://www.infoworld.com/article/3267624/whats-new-in-the-rust-language.html

本文:https://jiagoushi.pro/node/1811

Article
知识星球
 
微信公众号
 
视频号