Rust 1.80 新增对延迟静态变量的支持,扩展模式中的范围等功能

Rust 1.80 新特性总结

Rust 1.80 引入了多项新特性和改进,主要包括 LazyCellLazyLock 的稳定化、独占范围支持、新的 lint 警告、以及兼容 C23 的变参函数等。

1. LazyCellLazyLock 的稳定化

  • LazyCellLazyLock 用于延迟初始化数据,直到首次访问时才进行初始化。

    • LazyLock 是线程安全的版本。
    • OnceCellOnceLock 不同,LazyCellLazyLock 提供了更符合人体工程学的延迟初始化方式。
  • OnceCellOnceLock 在 Rust 1.70 中已稳定化,确保数据只初始化一次,但在延迟初始化时使用较为繁琐。

示例代码:

  • 使用 LazyLock 进行延迟初始化:

    use std::sync::LazyLock;
    
    static G_INT: LazyLock<u8> = LazyLock::new(|| 100);
    
    fn main() {
        let x = *G_INT; // 初始化在此处发生
        // ...
    }
  • 使用 OnceLock 进行延迟初始化:

    use std::sync::OnceLock;
    
    static G_INT: OnceLock<u8> = OnceLock::new();
    
    fn main() {
        let x = *G_INT.get_or_init(|| 100); 
        // ...
    }

2. 独占范围支持

  • Rust 1.80 引入了独占范围的支持,允许在模式匹配中使用 a..b..b 的语法。
  • 之前 Rust 仅支持包含端点的范围(如 a..=b..=b)。

示例代码:

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",
}

3. 新的 Lint 警告

  • 为了防止在现有代码中引入独占模式时的错误,Rust 1.80 引入了两个新的 lint 警告:

    • non_contiguous_range_endpoints:检测范围端点不连续的情况。
    • overlapping_range_endpoints:检测范围端点重叠的情况。

4. 变参函数的支持

  • Rust 1.80 支持不带命名参数的变参函数,这使得 Rust 更接近 C23 的语法。
  • 这一更改主要是移除了静态检查,允许这样的函数存在。

5. 其他改进

  • Rust 1.80 还在语言、编译器和标准库中引入了许多其他改进和稳定化的 API。

6. 详细发布说明

  • 更多新特性和稳定化的详细信息,请参考官方 发布说明

总结

Rust 1.80 通过引入 LazyCellLazyLock 提供了更便捷的延迟初始化方式,增加了独占范围支持,并引入了新的 lint 警告以防止常见错误。此外,变参函数的支持使得 Rust 更接近 C23 标准。这些改进进一步提升了 Rust 的灵活性和易用性。

阅读 89
0 条评论