Skip to content

Rust 1.80.0 版本发布

Posted on:2024年7月29日 at 21:49

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上下文中是稳定的,例如:

其他变化

更多关于Rust、Cargo和Clippy的变更细节请参考完整的版本发布说明。