2024年7月25日,Rust团队发布了Rust 1.80.0版本。Rust是一门致力于让每个人都能构建可靠且高效软件的编程语言。如果你已经通过rustup安装了之前的版本,可以通过以下命令升级到1.80.0:
$ rustup update stable
如果你还没有安装rustup,可以从Rust官方网站下载并安装。详细的1.80.0版本发布说明也可以在官网找到。
主要更新内容
LazyCell 和 LazyLock
Rust 1.80.0引入了新的“lazy”类型:LazyCell和LazyLock。这些类型在首次访问时延迟初始化其数据,类似于在1.70版本中稳定的OnceCell和OnceLock类型,但包括初始化函数。
LazyLock是线程安全的,非常适合用于静态值。例如,下面的代码中,无论是主线程还是子线程,都会看到相同的初始化时间:
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没有线程同步,因此不适用于静态变量,但可以用于thread_local!
静态变量,每个线程各自初始化。
检查 cfg 名称和值
在1.79版本中,rustc稳定了--check-cfg
标志,现在Cargo 1.80为所有已知的cfg名称和值启用了这些检查。这包括Cargo.toml中的特性名称以及来自构建脚本的新cargo::rustc-check-cfg
输出。未预期的cfg将由默认警告的unexpected_cfgs
lint报告,以捕捉拼写错误或其他配置错误。
模式中的排他区间
Rust现在支持模式中使用排他区间(a..b或..b),例如:
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..)区间。新的排他区间在匹配模式中减少了边界错误的风险,并且Rust的穷尽性检查已经增强以更好地检测模式匹配中的间隙。
稳定API
1.80.0版本中,有多个API现在在const上下文中是稳定的,例如:
<[T]>::last_chunk
BinaryHeap::new
- 其他新增和更新的API列表(如 Rc、Arc、NonNull、str、Ipv4Addr等)也已稳定。
其他变化
更多关于Rust、Cargo和Clippy的变更细节请参考完整的版本发布说明。