Rust 1.83.0 稳定版已正式发布,主要带来以下变化:
新的 const 功能
此版本对在 const contexts 中运行的代码的功能进行了多项重大扩展。指的是编译器在编译时必须评估的所有代码:const
和static
项的初始值、数组长度、枚举判别值、const 泛型参数以及可从此类上下文调用的函数(const fn
)。
对 statics 的引用。 到目前为止,除了static
项的初始化表达式之外,const contexts 都禁止引用static
项。此限制现已取消:
static S: i32 = 25;
const C: &i32 = &S;
值得注意的是,在 const contexts 中仍然不允许读取可变或内部可变静态的值。此外,常量的最终值不得引用任何可变或内部可变静态:
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`
这些限制确保 constants 仍然是“constant”:它们的求值及以及它们作为模式的含义(可能涉及取消引用引用)在整个程序执行过程中将是相同的。
尽管如此,还是允许常量求值到指向可变静态或内部可变静态的原始指针:
static mut S: i32 = 64;
const C: *mut i32 = &raw mut S;
可变引用和指针。 现在可以在 const contexts 中使用可变引用:
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 contexts 中很稳定。
详情可查看官方公告:https://blog.rust-lang.org/2024/11/28/Rust-1.83.0.html