宣布 Rust 1.50.0 版本

2021年2月11日 · Rust 发布团队

Rust 团队很高兴地宣布 Rust 的新版本 1.50.0。Rust 是一种编程语言,旨在帮助所有人构建可靠且高效的软件。

如果你之前通过 rustup 安装了 Rust,那么获取 Rust 1.50.0 版本非常简单,只需运行:

$ rustup update stable

如果你还没有安装,你可以从我们网站的相应页面 获取 rustup,并查看 GitHub 上 1.50.0 版本的详细发行说明

1.50.0 稳定版有哪些新功能

在此版本中,我们改进了数组索引,扩展了对 union 字段的安全访问,并向标准库添加了一些新功能。请参阅详细发行说明以了解本文未涵盖的其他更改。

常量泛型数组索引

为了继续向稳定的 const 泛型迈进,此版本为任意长度 const N 的数组 [T; N] 添加了 ops::IndexIndexMut 的实现。索引运算符 [] 已经通过内置的编译器魔法在数组上工作,但在类型级别,数组实际上直到现在才实现库 traits。

fn second<C>(container: &C) -> &C::Output
where
    C: std::ops::Index<usize> + ?Sized,
{
    &container[1]
}

fn main() {
    let array: [i32; 3] = [1, 2, 3];
    assert_eq!(second(&array[..]), &2); // slices worked before
    assert_eq!(second(&array), &2); // now it also works directly
}

数组的 const 值重复

Rust 中的数组可以写成列表形式 [a, b, c] 或重复形式 [x; N]。对于长度 N 大于 1 的情况,重复形式仅允许 xCopy 类型,而 RFC 2203 旨在允许任何 const 表达式。然而,虽然该功能对于任意表达式来说是不稳定的,但自 Rust 1.38 以来的实现意外地允许在数组重复中使用稳定的 const

fn main() {
    // This is not allowed, because `Option<Vec<i32>>` does not implement `Copy`.
    let array: [Option<Vec<i32>>; 10] = [None; 10];

    const NONE: Option<Vec<i32>> = None;
    const EMPTY: Option<Vec<i32>> = Some(Vec::new());

    // However, repeating a `const` value is allowed!
    let nones = [NONE; 10];
    let empties = [EMPTY; 10];
}

在 Rust 1.50 中,这种稳定化得到了正式承认。在未来,为了避免这种“临时”命名常量,你可以期待根据 RFC 2920 使用内联 const 表达式。

安全地赋值给 ManuallyDrop<T> union 字段

Rust 1.49 允许向 union 添加 ManuallyDrop<T> 字段,这是允许 union 实现 Drop 的一部分。然而,当字段被赋值时,union 不会 drop 旧值,因为它们不知道哪个变体以前是有效的,因此安全的 Rust 之前仅将其限制为永远不会 DropCopy 类型。当然,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 中,有九个新的稳定函数:

并且很多现有的函数被设为了 const

请参阅详细发行说明以了解其他更改。

其他更改

Rust 1.50.0 版本中还有其他更改:请查看 RustCargoClippy 中的更改。

1.50.0 的贡献者

很多人齐心协力创建了 Rust 1.50.0。没有你们所有人,我们不可能做到。谢谢!