宣布 Rust 1.83.0

2024 年 11 月 28 日 · Rust 发布团队

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

如果你之前通过 rustup 安装了 Rust 的版本,你可以使用以下命令获取 1.83.0:

$ rustup update stable

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

如果你想通过测试未来的版本来帮助我们,你可以考虑在本地更新以使用 beta 频道 (rustup default beta) 或 nightly 频道 (rustup default nightly)。请报告你可能遇到的任何错误!

1.83.0 稳定版有哪些新内容

新的 const 功能

此版本包括对 const 上下文中可以运行的代码的几个重大扩展。这指的是编译器必须在编译时评估的所有代码:conststatic 项的初始值、数组长度、枚举判别式值、const 泛型参数以及可从这些上下文调用的函数 (const fn)。

引用 statics。 到目前为止,除了 static 项的初始化表达式之外,const 上下文被禁止引用 static 项。现在已取消此限制

static S: i32 = 25;
const C: &i32 = &S;

但请注意,在 const 上下文中仍然不允许读取可变或内部可变 static 的值。此外,常量的最终值不得引用任何可变或内部可变 statics

static mut S: i32 = 0;

const C1: i32 = unsafe { S };
// error: constant accesses mutable global memory

const C2: &i32 = unsafe { &S };
// error: encountered reference to mutable memory in `const`

这些限制确保常量仍然是“常量”:它们评估的值以及它们作为模式的含义(可能涉及解引用引用)在整个程序执行过程中将是相同的。

也就是说,常量可以评估为指向可变或内部可变 static 的原始指针

static mut S: i32 = 64;
const C: *mut i32 = &raw mut S;

可变引用和指针。 现在可以在 const 上下文中使用可变引用

const fn inc(x: &mut i32) {
    *x += 1;
}

const C: i32 = {
    let mut c = 41;
    inc(&mut c);
    c
};

也支持可变原始指针和内部可变性

use std::cell::UnsafeCell;

const C: i32 = {
    let c = UnsafeCell::new(41);
    unsafe { *c.get() += 1 };
    c.into_inner()
};

但是,可变引用和指针只能在常量的计算内部使用,它们不能成为常量最终值的一部分

const C: &mut i32 = &mut 4;
// error[E0764]: mutable references are not allowed in the final value of constants

此版本还附带了大量新的函数,这些函数现在在 const 上下文中是稳定的(请参阅“稳定的 API”部分的末尾)。

这些新功能和稳定的 API 解锁了在 const 上下文中执行的全新代码类别,我们很高兴看到 Rust 生态系统将如何利用这一点!

稳定的 API

这些 API 现在在 const 上下文中是稳定的

其他更改

查看 RustCargoClippy 中更改的所有内容。

1.83.0 的贡献者

许多人齐心协力创建了 Rust 1.83.0。没有你们大家,我们不可能做到。谢谢!