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 稳定版中的新内容

在这个版本中,我们改进了数组索引,扩展了对联合字段的安全访问,并对标准库进行了补充。查看详细的发布说明,了解本文未涵盖的其他更改。

常量泛型数组索引

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

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> 联合字段的安全赋值

Rust 1.49 使得将 ManuallyDrop<T> 字段添加到 union 成为可能,这是允许 union 使用 Drop 的一部分。但是,联合在分配字段时不会丢弃旧值,因为它们不知道哪个变体以前是有效的,因此安全的 Rust 以前将此限制为仅 Copy 类型,这些类型永远不会 Drop。当然,ManuallyDrop<T> 也不需要 Drop,因此现在 Rust 1.50 也允许对这些字段进行安全赋值。

在 Unix 平台上为 File 提供一个利基

Rust 中的某些类型对被认为是有效值的范围有特定限制,这可能不涵盖所有可能的内存值范围。我们将任何剩余的无效值称为利基,此空间可用于类型布局优化。例如,在 Rust 1.28 中,我们引入了 NonZero 整数类型(如 NonZeroU8),其中 0 是一个利基,这使得 Option<NonZero> 可以使用 0 来表示 None,而无需额外的内存。

在 Unix 平台上,Rust 的 File 仅仅由系统的整数文件描述符组成,而这恰好也可能有一个利基,因为它永远不可能是 -1!返回文件描述符的系统调用使用 -1 来指示发生了错误(检查 errno),因此 -1 永远不可能是真正的文件描述符。从 Rust 1.50 开始,此利基被添加到类型的定义中,以便它也可以用于布局优化。因此,Option<File> 现在将与 File 本身具有相同的大小!

库更改

在 Rust 1.50.0 中,有九个新的稳定函数

并且相当多的现有函数被设置为 const

查看详细的发布说明,了解其他更改。

其他更改

Rust 1.50.0 版本中还有其他更改:查看RustCargoClippy 中发生了哪些变化。

1.50.0 的贡献者

许多人共同创建了 Rust 1.50.0。没有你们,我们不可能做到。 谢谢!