写点什么

Rust 1.80 提供 Lazy Statics 稳定支持,并支持在模式匹配中使用开区间

  • 2024-08-23
    北京
  • 本文字数:1060 字

    阅读完需:约 3 分钟

Rust 1.80 提供 Lazy Statics 稳定支持,并支持在模式匹配中使用开区间

Rust 1.80 稳定了LazyCellLazyLock。借助这两个新类型,开发人员可以将数据的初始化延迟到第一次访问时。该版本提供了对开区间的支持以及一些相关的 lint 警告。为了与 C23 兼容,该版本允许使用不带命名参数的可变函数。此外,它还稳定了许多 API。


LazyCellLazyLock可以延迟共享数据的初始化,其中LazyLock是线程安全的。类似地,OnceCellOnceLock(支持共享数据的一次性初始化,在 Rust 1.70 中已稳定)也可以用于延迟初始化,只是不那么符合人体工程学。


以下代码使用LazyLock定义一个延迟初始化的全局变量:


use std::sync::LazyLock;
static G_INT: LazyLock<u8> = LazyLock::new(|| 100);
fn main() { let x = *G_INT; // 初始化发生在这里 // ...}
复制代码


OnceLock的语法中,你定义一个值而不显式地对其进行初始化。取而代之,你可以在第一次访问它时使用OnceLock::get_or_init()函数:


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


OnceLockOnceCell的用途与Lazy*不同,它们是为了确保一个值只初始化一次。使用它们延迟初始化时,你需要在访问它们的每个地方都使用相同的初始化语句,这很麻烦。在这 4 种类型中,LazyLock是你在大多数情况下都可以安全地使用的一种类型;如果你想要消除任何与并发相关的开销,则可以使用LazyCellOnceLockOnceCell可以方便你灵活地处理初始化逻辑,支持更复杂的用例。


该版本还对该语言做了另外一项有用的补充,就是在模式匹配中支持开区间。在 1.80 版本之前,Rust 只支持闭区间,写为a..=b..=b。现在,你也可以使用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",    }
复制代码


为了降低“差一错误”的可能性,Rust 1.80 引入了两个新的 lint:non_continuous_range_endpointsoverlapping_range_endpoints,它们可以在现有代码采用开区间模式时检测错误。


Rust 1.80 还在语言、编译器和标准库中引入了许多其他的变更。一个很小但值得注意的新特性是,支持不带命名参数的可变函数。这相当于删除了一个不允许此类函数的静态检查,使得该语言更接近支持该语法的 C23。


要了解关于 Rust 1.80 中所有新功能和稳定性的详细信息,可以查阅官方的发布说明。


原文链接:

https://www.infoq.com/news/2024/08/rust-1-80-lazy-globals/

2024-08-23 08:0010071

评论 1 条评论

发布
用户头像
用游戏rust的logo作为文章配图,搞笑的吧
2024-08-28 19:52 · 上海
回复
没有更多了
发现更多内容

RxJS 全面解析

阿杰

JavaScript 响应式编程 RXJS

2023年语言和框架我们值得关注什么?

阿里巴巴终端技术

框架 语言 & 开发

最佳实践 | 用腾讯云AI人像变换给自己一次“跨越年龄的体验”

牵着蜗牛去散步

人工智能 腾讯云 腾讯 腾讯云AI

带你了解S12直播中的“黑科技”

华为云开发者联盟

云计算 后端 音视频 华为云 实时直播

华为云开发者日震撼来袭!11月20日,上海见!

华为云开发者联盟

开发者 华为云

自制操作系统日记(7):字符串显示

操作系统

阿里云产品经理刘宇:Serverless 的前世今生

云布道师

阿里云 Serverless 云原生

软件测试 | 测试人员必须掌握的测试用例

测试人

软件测试 自动化测试 测试开发 测试用例

比DataX快20%!SeaTunnel同步计算引擎性能测试全新发布

Apache SeaTunnel

spark DataX Seatunnel 数据集成平台 数据引擎

全国首个AIGC创作大赛开赛,创作者可靠“AI打工人”躺赚

科技热闻

制造业行业现状及智能生产管理系统一体化解决方案

优秀

制造业 生产管理系统

实时云渲染vs本地渲染,哪个更好用?

Finovy Cloud

云渲染 实时云渲染

Docker发布/上传镜像到dockerhub&&下载/拉取镜像&&删除dockerhub镜像

A-刘晨阳

Docker Linux 运维 11月月更

Docker——denied: requested access to the resource is denied问题以及解决方法

A-刘晨阳

Docker Linux 运维 11月月更

使用SQL加密函数实现数据列的加解密

华为云开发者联盟

大数据 后端 华为云 数据加密

Dive into TensorFlow系列(2)- 解析TF核心抽象op算子

京东科技开发者

tensorflow TF2 Tensor Op

PLC与SCADA的什么区别和联系

2D3D前端可视化开发

物联网 PLC 工业控制 web组态 SCADA

使用 SAP Cloud Application Programming 编程模型开发一个图书管理 OData 服务

汪子熙

云原生 CAP SAP 企业级应用 11月月更

OKR之剑·实战篇03:OKR的跟踪需要有“自己”的节奏

vivo互联网技术

团队管理 OKR 目标管理

[力扣] 剑指 Offer 第二天 - 反转链表

陈明勇

Go 数据结构与算法 力扣 11月月更

docker修改容器的端口、容器名、映射地址......

A-刘晨阳

Docker Linux 运维 11月月更

Kotlin函数声明与闭包

子不语Any

android kotlin 11月月更

RxJS 全面解析

PingCode研发中心

响应式编程 RXJS reactivex

微服务熔断限流的一些使用场景

Java永远的神

Java 程序员 微服务 程序人生 架构师

多视角碰撞,探索 Serverless 企业落地更多可能性丨阿里云用户组厦门站

云布道师

阿里云 云原生

OceanBase 首席科学家阳振坤博士入选2022 年度“CCF王选奖”

OceanBase 数据库

直播预告|OceanBase 社区版 4.0 全解析

OceanBase 数据库

web技术分享| 日期选择限制组件二次封装

anyRTC开发者

Vue 前端 Web Element

SREWorks v1.3 版本发布 | 插件机制发布

阿里云大数据AI技术

大数据 运维 插件

[力扣] 剑指 Offer 第二天 - 从尾到头打印链表

陈明勇

Go 数据结构与算法 力扣 11月月更

技术分享 | 测试人员必须掌握的测试用例

霍格沃兹测试开发学社

Rust 1.80 提供 Lazy Statics 稳定支持,并支持在模式匹配中使用开区间_编程语言_Sergio De Simone_InfoQ精选文章