Rust 团队很高兴地宣布 Rust 的新版本 1.80.0。Rust 是一种编程语言,旨在帮助每个人构建可靠且高效的软件。
如果您之前通过 rustup
安装了 Rust,您可以使用以下命令获取 1.80.0 版本:
$ rustup update stable
如果您还没有安装,您可以从我们网站上的相应页面获取 rustup
,并查看 1.80.0 版本的详细发布说明。
如果您想通过测试未来的版本来帮助我们,您可以考虑在本地更新以使用 beta 频道 (rustup default beta
) 或 nightly 频道 (rustup default nightly
)。请报告您可能遇到的任何错误!
1.80.0 稳定版的新特性
LazyCell
和 LazyLock
这些“惰性”类型会延迟其数据的初始化,直到首次访问时才进行。它们类似于 1.70 版本中稳定的 OnceCell
和 OnceLock
类型,但初始化函数包含在 cell 中。这完成了从流行的 lazy_static
和 once_cell
crate 采用到标准库的功能的稳定化。
LazyLock
是线程安全的选项,使其适用于 static
值等位置。例如,spawn
线程和主 scope
都将看到完全相同的持续时间,因为 LAZY_TIME
将只初始化一次,由最终首先访问 static 的线程初始化。与使用 OnceLock::get_or_init()
不同,两者都不需要知道如何初始化它。
use std::sync::LazyLock;
use std::time::Instant;
static LAZY_TIME: LazyLock<Instant> = LazyLock::new(Instant::now);
fn main() {
let start = Instant::now();
std::thread::scope(|s| {
s.spawn(|| {
println!("Thread lazy time is {:?}", LAZY_TIME.duration_since(start));
});
println!("Main lazy time is {:?}", LAZY_TIME.duration_since(start));
});
}
LazyCell
执行相同的操作,但没有线程同步,因此它不实现 Sync
,这是 static
所需的,但它仍然可以在 thread_local!
静态变量中使用(每个线程进行不同的初始化)。任何一种类型也可以在其他数据结构中使用,具体取决于线程安全需求,因此惰性初始化在任何地方都可用!
cfg
名称和值
已检查的 在 1.79 版本中,rustc
稳定了一个 --check-cfg
标志,现在 Cargo 1.80 正在为它知道的所有 cfg
名称和值启用这些检查(除了来自 rustc
的 众所周知的名称和值 之外)。这包括来自 Cargo.toml
的 feature 名称以及来自构建脚本的新 cargo::rustc-check-cfg
输出。
意外的 cfgs 由默认警告的 unexpected_cfgs
lint 报告,该 lint 旨在捕获拼写错误或其他配置错误。例如,在具有可选 rayon
依赖项的项目中,此代码配置了错误的 feature
值
fn main() {
println!("Hello, world!");
#[cfg(feature = "crayon")]
rayon::join(
|| println!("Hello, Thing One!"),
|| println!("Hello, Thing Two!"),
);
}
warning: unexpected `cfg` condition value: `crayon`
--> src/main.rs:4:11
|
4 | #[cfg(feature = "crayon")]
| ^^^^^^^^^^--------
| |
| help: there is a expected value with a similar name: `"rayon"`
|
= note: expected values for `feature` are: `rayon`
= help: consider adding `crayon` as a feature in `Cargo.toml`
= note: see <https://doc.rust-lang.net.cn/nightly/rustc/check-cfg/cargo-specifics.html> for more information about checking conditional configuration
= note: `#[warn(unexpected_cfgs)]` on by default
无论实际是否启用了 rayon
feature,都会报告相同的警告。
Cargo.toml
清单中的 [lints]
表也可以用于扩展自定义 cfg
的已知名称和值列表。rustc
自动提供 在警告中使用的语法。
[lints.rust]
unexpected_cfgs = { level = "warn", check-cfg = ['cfg(foo, values("bar"))'] }
您可以在 之前的博客文章中阅读有关此功能的更多信息,该文章宣布了 nightly 版本上该功能的可用性。
模式中的独占范围
Rust 范围模式现在可以使用独占端点,写作 a..b
或 ..b
,类似于 Range
和 RangeTo
表达式类型。例如,以下模式现在可以为一个模式的结尾和下一个模式的开头使用相同的常量
pub fn size_prefix(n: u32) -> &'static str {
const K: u32 = 10u32.pow(3);
const M: u32 = 10u32.pow(6);
const G: u32 = 10u32.pow(9);
match n {
..K => "",
K..M => "k",
M..G => "M",
G.. => "G",
}
}
以前,模式中只允许包含性(a..=b
或 ..=b
)或开放(a..
)范围,因此像这样的代码需要为包含性端点(如 K - 1
)使用单独的常量。
独占范围作为一个不稳定的功能已经实现很长时间了,但主要的担忧是它们可能会增加混乱并增加模式中出现 off-by-one 错误的机会。为此,已经增强了穷尽性检查,以更好地检测模式匹配中的差距,新的 lint non_contiguous_range_endpoints
和 overlapping_range_endpoints
将帮助检测您可能想要将独占模式切换为包含性模式,反之亦然的情况。
稳定的 API
impl Default for Rc<CStr>
impl Default for Rc<str>
impl Default for Rc<[T]>
impl Default for Arc<str>
impl Default for Arc<CStr>
impl Default for Arc<[T]>
impl IntoIterator for Box<[T]>
impl FromIterator<String> for Box<str>
impl FromIterator<char> for Box<str>
LazyCell
LazyLock
Duration::div_duration_f32
Duration::div_duration_f64
Option::take_if
Seek::seek_relative
BinaryHeap::as_slice
NonNull::offset
NonNull::byte_offset
NonNull::add
NonNull::byte_add
NonNull::sub
NonNull::byte_sub
NonNull::offset_from
NonNull::byte_offset_from
NonNull::read
NonNull::read_volatile
NonNull::read_unaligned
NonNull::write
NonNull::write_volatile
NonNull::write_unaligned
NonNull::write_bytes
NonNull::copy_to
NonNull::copy_to_nonoverlapping
NonNull::copy_from
NonNull::copy_from_nonoverlapping
NonNull::replace
NonNull::swap
NonNull::drop_in_place
NonNull::align_offset
<[T]>::split_at_checked
<[T]>::split_at_mut_checked
str::split_at_checked
str::split_at_mut_checked
str::trim_ascii
str::trim_ascii_start
str::trim_ascii_end
<[u8]>::trim_ascii
<[u8]>::trim_ascii_start
<[u8]>::trim_ascii_end
Ipv4Addr::BITS
Ipv4Addr::to_bits
Ipv4Addr::from_bits
Ipv6Addr::BITS
Ipv6Addr::to_bits
Ipv6Addr::from_bits
Vec::<[T; N]>::into_flattened
<[[T; N]]>::as_flattened
<[[T; N]]>::as_flattened_mut
这些 API 现在在 const 上下文中是稳定的
其他更改
查看 Rust、Cargo 和 Clippy 中发生的所有更改。
1.80.0 版本的贡献者
许多人共同创造了 Rust 1.80.0。没有你们所有人,我们不可能做到。谢谢!