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)。请报告您可能遇到的任何 bug!
1.83.0 稳定版包含的内容
新的 const 能力
此版本包含了对在 const 上下文(const contexts)中运行的代码可以执行的操作的几项重大扩展。这指的是编译器必须在编译时评估的所有代码:const 和 static 项的初始值、数组长度、枚举判别值、const 泛型参数,以及可以从这些上下文调用的函数(const fn)。
对 static 项的引用。 到目前为止,除 static 项的初始化表达式外,const 上下文被禁止引用 static 项。现在这一限制已经被解除。
static S: i32 = 25;
const C: &i32 = &S;
然而请注意,在 const 上下文中仍然不允许读取可变或内部可变(interior mutable)的 static 的值。此外,常量的最终值不能引用任何可变或内部可变的 static。
static mut S: i32 = 0;
const C1: i32 = unsafe ;
// error: constant accesses mutable global memory
const C2: &i32 = unsafe ;
// error: encountered reference to mutable memory in `const`
这些限制确保常量仍然是“常量”:它们评估得到的值,以及它们作为模式(可能涉及解引用引用)的含义,将在整个程序执行过程中保持一致。
尽管如此,允许常量评估为一个指向可变或内部可变 static 的裸指针(raw pointer)。
static mut S: i32 = 64;
const C: *mut i32 = &raw mut S;
可变引用和指针。 现在可以在 const 上下文中使用可变引用了。
const
const C: i32 = ;
可变裸指针(mutable raw pointers)和内部可变性(interior mutability)也得到了支持。
use UnsafeCell;
const C: i32 = ;
然而,可变引用和指针只能在常量的计算过程内部使用,它们不能成为常量最终值的一部分。
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_untilControlFlow::break_valueControlFlow::continue_valueControlFlow::map_breakControlFlow::map_continueDebugList::finish_non_exhaustiveDebugMap::finish_non_exhaustiveDebugSet::finish_non_exhaustiveDebugTuple::finish_non_exhaustiveErrorKind::ArgumentListTooLongErrorKind::DeadlockErrorKind::DirectoryNotEmptyErrorKind::ExecutableFileBusyErrorKind::FileTooLargeErrorKind::HostUnreachableErrorKind::IsADirectoryErrorKind::NetworkDownErrorKind::NetworkUnreachableErrorKind::NotADirectoryErrorKind::NotSeekableErrorKind::ReadOnlyFilesystemErrorKind::ResourceBusyErrorKind::StaleNetworkFileHandleErrorKind::StorageFullErrorKind::TooManyLinksOption::get_or_insert_defaultWaker::dataWaker::newWaker::vtablechar::MINhash_map::Entry::insert_entryhash_map::VacantEntry::insert_entry
这些 API 现在在 const 上下文中稳定化:
Cell::into_innerDuration::as_secs_f32Duration::as_secs_f64Duration::div_duration_f32Duration::div_duration_f64MaybeUninit::as_mut_ptrNonNull::as_mutNonNull::copy_fromNonNull::copy_from_nonoverlappingNonNull::copy_toNonNull::copy_to_nonoverlappingNonNull::slice_from_raw_partsNonNull::writeNonNull::write_bytesNonNull::write_unalignedOnceCell::into_innerOption::as_mutOption::expectOption::replaceOption::takeOption::unwrapOption::unwrap_uncheckedOption::<&_>::copiedOption::<&mut _>::copiedOption::<Option<_>>::flattenOption::<Result<_, _>>::transposeRefCell::into_innerResult::as_mutResult::<&_, _>::copiedResult::<&mut _, _>::copiedResult::<Option<_>, _>::transposeUnsafeCell::get_mutUnsafeCell::into_innerarray::from_mutchar::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_bytesmem::replaceptr::replaceptr::slice_from_raw_parts_mutptr::writeptr::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_unalignedslice::from_mutslice::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_mutstr::as_bytes_mutstr::as_mut_ptrstr::from_utf8_unchecked_mut
其他变更
查看 Rust (所有变更), Cargo (所有变更), 和 Clippy (所有变更) 中的所有变更。
1.83.0 的贡献者
许多人共同努力才得以发布 Rust 1.83.0。没有你们所有人,这一切都不可能。感谢!