Rust 团队很高兴地宣布 Rust 的新版本 1.50.0。Rust 是一门赋予每个人构建可靠且高效软件能力的编程语言。
如果您之前通过 rustup 安装了 Rust,获取 Rust 1.50.0 非常简单,只需运行
$ rustup update stable
如果您尚未安装,您可以从我们网站的相应页面获取 rustup,并在 GitHub 上查看1.50.0 的详细发行说明。
1.50.0 稳定版包含什么内容
在此版本中,我们改进了数组索引,扩展了对联合字段的安全访问,并向标准库中添加了内容。请参阅详细发行说明,了解本文未涵盖的其他更改。
Const 泛型数组索引
继续推进 const 泛型稳定化,此版本为任意 const N 长度的数组 [T; N] 添加了 ops::Index 和 IndexMut 的实现。索引运算符 [] 以前通过内置编译器魔术就可以用于数组,但在类型层面,数组直到现在才真正实现了这些库 trait。
数组的 const 值重复
Rust 中的数组可以写成列表形式 [a, b, c] 或重复形式 [x; N]。对于长度 N 大于一的情况,重复形式只允许用于 Copy 类型的 x,而RFC 2203 希望允许任何 const 表达式出现在那里。然而,虽然该特性对于任意表达式而言尚不稳定,但自 Rust 1.38 以来,其实现却意外地允许在数组重复中使用 const *值*。
在 Rust 1.50 中,这项稳定化被正式确认。将来,为了避免这种“临时”的命名常量,您可以期待根据RFC 2920 实现的内联 const 表达式。
安全地赋值给 ManuallyDrop<T> 联合字段
Rust 1.49 使得将 ManuallyDrop<T> 字段添加到 union 成为可能,这是允许 union 实现 Drop 的一部分。然而,当一个字段被赋值时,联合不会丢弃旧值,因为它们不知道之前哪个变体是有效的,因此安全 Rust 之前将此限制为仅 Copy 类型,这些类型永远不会执行 Drop。当然,ManuallyDrop<T> 也不需要执行 Drop,所以现在 Rust 1.50 也允许安全地赋值给这些字段。
Unix 平台上的 File 类型的 Niche
Rust 中的某些类型对有效值有所限制,这些有效值可能无法覆盖所有可能的内存值范围。我们将任何剩余的无效值称为 niche,这部分空间可用于类型布局优化。例如,在 Rust 1.28 中,我们引入了 NonZero 整型(例如 NonZeroU8),其中 0 是一个 niche,这使得 Option<NonZero> 可以使用 0 来表示 None,无需额外的内存开销。
在 Unix 平台上,Rust 的 File 实际上就是系统的整型文件描述符,而这个文件描述符恰好也有一个可能的 niche,因为它永远不可能是 -1!返回文件描述符的系统调用使用 -1 来指示发生了错误(可以检查 errno),因此 -1 不可能是一个实际的文件描述符。从 Rust 1.50 开始,这个 niche 被添加到该类型的定义中,这样它也可以用于布局优化。因此,Option<File> 现在将与 File 本身具有相同的大小!
库变更
在 Rust 1.50.0 中,新增了九个稳定的函数
bool::thenbtree_map::Entry::or_insert_with_keyf32::clampf64::clamphash_map::Entry::or_insert_with_keyOrd::clampRefCell::takeslice::fillUnsafeCell::get_mut
并且一些现有函数变成了 const 函数
IpAddr::is_ipv4IpAddr::is_ipv6Layout::sizeLayout::alignLayout::from_size_alignpow用于所有整型。checked_pow用于所有整型。saturating_pow用于所有整型。wrapping_pow用于所有整型。next_power_of_two用于所有无符号整型。checked_power_of_two用于所有无符号整型。
请参阅详细发行说明,了解其他变更。
其他变更
Rust 1.50.0 版本还有其他变更:请查看 Rust、Cargo 和 Clippy 的变更。
1.50.0 版本的贡献者
许多人共同努力创建了 Rust 1.50.0。没有你们大家,我们不可能完成这项工作。谢谢!