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 上下文中可以运行的代码的几个重大扩展。这指的是编译器必须在编译时评估的所有代码:const
和 static
项的初始值、数组长度、枚举判别式值、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
BufRead::skip_until
ControlFlow::break_value
ControlFlow::continue_value
ControlFlow::map_break
ControlFlow::map_continue
DebugList::finish_non_exhaustive
DebugMap::finish_non_exhaustive
DebugSet::finish_non_exhaustive
DebugTuple::finish_non_exhaustive
ErrorKind::ArgumentListTooLong
ErrorKind::Deadlock
ErrorKind::DirectoryNotEmpty
ErrorKind::ExecutableFileBusy
ErrorKind::FileTooLarge
ErrorKind::HostUnreachable
ErrorKind::IsADirectory
ErrorKind::NetworkDown
ErrorKind::NetworkUnreachable
ErrorKind::NotADirectory
ErrorKind::NotSeekable
ErrorKind::ReadOnlyFilesystem
ErrorKind::ResourceBusy
ErrorKind::StaleNetworkFileHandle
ErrorKind::StorageFull
ErrorKind::TooManyLinks
Option::get_or_insert_default
Waker::data
Waker::new
Waker::vtable
char::MIN
hash_map::Entry::insert_entry
hash_map::VacantEntry::insert_entry
这些 API 现在在 const 上下文中是稳定的
Cell::into_inner
Duration::as_secs_f32
Duration::as_secs_f64
Duration::div_duration_f32
Duration::div_duration_f64
MaybeUninit::as_mut_ptr
NonNull::as_mut
NonNull::copy_from
NonNull::copy_from_nonoverlapping
NonNull::copy_to
NonNull::copy_to_nonoverlapping
NonNull::slice_from_raw_parts
NonNull::write
NonNull::write_bytes
NonNull::write_unaligned
OnceCell::into_inner
Option::as_mut
Option::expect
Option::replace
Option::take
Option::unwrap
Option::unwrap_unchecked
Option::<&_>::copied
Option::<&mut _>::copied
Option::<Option<_>>::flatten
Option::<Result<_, _>>::transpose
RefCell::into_inner
Result::as_mut
Result::<&_, _>::copied
Result::<&mut _, _>::copied
Result::<Option<_>, _>::transpose
UnsafeCell::get_mut
UnsafeCell::into_inner
array::from_mut
char::encode_utf8
{float}::classify
{float}::is_finite
{float}::is_infinite
{float}::is_nan
{float}::is_normal
{float}::is_sign_negative
{float}::is_sign_positive
{float}::is_subnormal
{float}::from_bits
{float}::from_be_bytes
{float}::from_le_bytes
{float}::from_ne_bytes
{float}::to_bits
{float}::to_be_bytes
{float}::to_le_bytes
{float}::to_ne_bytes
mem::replace
ptr::replace
ptr::slice_from_raw_parts_mut
ptr::write
ptr::write_unaligned
<*const _>::copy_to
<*const _>::copy_to_nonoverlapping
<*mut _>::copy_from
<*mut _>::copy_from_nonoverlapping
<*mut _>::copy_to
<*mut _>::copy_to_nonoverlapping
<*mut _>::write
<*mut _>::write_bytes
<*mut _>::write_unaligned
slice::from_mut
slice::from_raw_parts_mut
<[_]>::first_mut
<[_]>::last_mut
<[_]>::first_chunk_mut
<[_]>::last_chunk_mut
<[_]>::split_at_mut
<[_]>::split_at_mut_checked
<[_]>::split_at_mut_unchecked
<[_]>::split_first_mut
<[_]>::split_last_mut
<[_]>::split_first_chunk_mut
<[_]>::split_last_chunk_mut
str::as_bytes_mut
str::as_mut_ptr
str::from_utf8_unchecked_mut
其他更改
查看 Rust、Cargo 和 Clippy 中更改的所有内容。
1.83.0 的贡献者
许多人齐心协力创建了 Rust 1.83.0。没有你们大家,我们不可能做到。谢谢!