写点什么

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:0010375

评论 1 条评论

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

浅析低代码开发的典型应用构建场景

力软低代码开发平台

终于有人把动态规划、冒泡排序、二叉树、链表、栈全部讲清楚了

收到请回复

程序员 java

Logrotate正则匹配文件名

linux大本营

正则表达式 Linux

编程中最难的就是命名?这几招教你快速上手

阿里巴巴云原生

阿里云 编程 云原生

使用Plist编辑器——简单入门指南

构建数据中台——数据只有被使用起来,才能创造价值

引迈信息

数据库 数据中台 低代码 JNPF 数字化、操作系统、中台

有道CEO周枫:当我们谈论大模型时,应该关注哪些新能力?

有道技术团队

手语识别:解锁语言交流的新时代

数据堂

文本搜索工具ack与grep

坚果

Linux 三周年连更

已知非空线性链表由list指出,链结点的构造为(data,next)。写-算法,将链表中数据域值最小的那个链结点移到链表的最前面。要求:不得额外申请新的链结点

linux大本营

链表 C语言 数据结构与算法

发送GET请求时,浏览器请求的参数是指什么

linux大本营

HTTP url GET

Rust、Go 和 Swift 在性能和并发性方面有何差异?

非凸科技

Go swift 性能 编程语言 高并发

为开发者搭建创新舞台 OpenHarmony创新赛正式启动

最新动态

九层天塔DApp合约系统开发搭建

薇電13242772558

NFT

Go 语言快速入门指南:GET 和 POST 方法

宇宙之一粟

Go HTTP post GET 三周年连更

logrotate怎么使用

linux大本营

Linux 日志管理

qemu怎么用

linux大本营

qemu

seq命令

linux大本营

Shell 脚本

nvmf协议

linux大本营

网络协议 nvme RDMA技术

从零学习SDK(9)SDK的局限

MobTech袤博科技

FBEC大会 | 瑞云科技 CTO 赵志杰:元宇宙时代的基础设施——实时云渲染

3DCAT实时渲染

实时渲染 实时云渲染 实时渲染云

C语言system函数判断返回错误

linux大本营

C语言

如何通过C#/VB.NET代码将PowerPoint转换为HTML

在下毛毛雨

html PowerPoint 文档转换

【源码分析】【seata】at模式分布式事务-tm实现逻辑

如果晴天

源码分析 分布式事务 seata Seata框架

世优科技AI数字人产品“世优BOTA”发布!全面提升AI虚拟员工能力

联营汇聚

linux如何设置一个环境变量,在shell退出之后也不会失效

linux大本营

Linux Shell export

Apache Flink ML 2.2.0 发布公告

Apache Flink

大数据 flink 实时计算

没有主机跑开源软件?速来牧云助手免费领一台!

百川云开发者

云计算 开源 云主机 教程 免费

DevOps 与研发效能资深技术专家张乐:研发效能的升维思考与降维执行

万事ONES

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