9 月 13 日,2025 Inclusion・外滩大会「开源嘉年华」正在限量报名中! 了解详情
写点什么

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

评论 1 条评论

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

重磅更新:草料二维码容量调整,不再限制图片文件上传量

草料二维码

基于OceanBase+Flink CDC,云粒智慧实时数仓演进之路

Apache Flink

flink oceanbase 实时数据

云桌面的应用场景,如何助力企业轻松上云

青椒云云电脑

云桌面 云电脑 云电脑平台

SD-WAN助力企业实现多分支互联

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SDWAN

DY短视频批量爬虫提取工具功能介绍

Geek_16d138

好用的软件分享

元组与列表:相同点、不同点及内存占用

测吧(北京)科技有限公司

测试

为什么公共云的弹性能力很难被发挥出来?

AutoMQ

Java 大数据 云原生 AutoMQ

深入了解字符串:定义、转义字符和字符串下标

测吧(北京)科技有限公司

测试

什么是运算符

测吧(北京)科技有限公司

测试

深入理解逻辑运算符及其短路特性

测吧(北京)科技有限公司

测试

KaiwuDB 参编的《分析型数据库技术要求》标准正式发布

KaiwuDB

数据库 分析型数据库 数据库行业标准制定 数据库标准

深入了解条件判断、状态标记和假值状态

测吧(北京)科技有限公司

测试

如何在MySQL 中更改数据的前几位数字?

霍格沃兹测试开发学社

了解元组:定义、特点、应用及常用方法

测吧(北京)科技有限公司

测试

企业如何训练自己的专属大模型?

幂简集成

AI API 大模型

解锁工业数据流:NeuronEX 规则调试功能实操指南

EMQ映云科技

emq emqx NeuronEX

深入理解 FFmpeg:安装和使用指南

霍格沃兹测试开发学社

建发弘爱 X 袋鼠云:加速提升精细化、数字化医疗健康服务能力

袋鼠云数栈

数据资产 医疗 医疗AI 医疗中台 数据服务

2024春季火山引擎FORCE原动力大会,5月15日开幕

新消费日报

Bonree ONE 2024春季正式版:革新智能运维,7 大功能亮点重磅发布

博睿数据

云手机:海外舆情监控的新工具

Ogcloud

云手机 海外云手机 云手机海外版 国外云手机 跨境云手机

理解标准数据类型及类型查看

测吧(北京)科技有限公司

测试

深入理解计数器函数:闭包与装饰器

测吧(北京)科技有限公司

测试

掌握Python中的系统监控与管理:使用psutil库

霍格沃兹测试开发学社

深入理解变量:定义、使用和地址

测吧(北京)科技有限公司

测试

免费云电脑能做什么?

青椒云云电脑

云桌面 云电脑

探究字符串操作的各种类别

测吧(北京)科技有限公司

测试

线程池核心原理浅析

不在线第一只蜗牛

线程 核心原理

关于零信任理念, 零信任的重点是什么

德迅云安全杨德俊

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