【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

Rust 1.65 引入泛型关联类型,向高级类类型迈进了一步

  • 2022-11-28
    北京
  • 本文字数:1193 字

    阅读完需:约 4 分钟

Rust 1.65引入泛型关联类型,向高级类类型迈进了一步

最新版本的 Rust 引入了一个功能强大的新语言特性,叫作泛型关联类型,允许开发人员为 trait 中的关联类型指定泛型。其他值得注意的新特性还包括 let-else 语句,以及对跳出标记块的支持。


经过6年的开发,泛型关联类型(GAT)可以被认为是trait类型构造函数的一种形式,可以用来定义关联类型的泛型、寿命或常量泛型。


这个特性(关联类型构造函数)解决了高级类类型最常见的用例之一,与其他形式的高级类类型多态相比,它是对类型系统的一个相对简单的扩展,并向前兼容将来可能引入的更复杂的高级类类型多态。


Rust中的关联类型是定义通用 trait 的一种机制。例如,在下面的例子中有一个叫作 Graph 的 trait,它的节点和边使用了两个关联类型。


trait Graph {    type N;    type E;
fn has_edge(&self, _: &Self::N, _: &Self::N) -> bool; fn edges(&self, _: &Self::N) -> Vec<Self::E>}
复制代码


使用关联类型提高了代码的可读性。Graph 的客户端确实可以使用它,而不需要每次都指定其关联的类型是什么,这对于泛型类型来说是必需的。例如:

fn distance<C: Contains>(graph: &G, start: &G::N, end: &G::N) -> i32 { ... }
复制代码


现在,GTA 引入了一种方法来指定本身就是泛型的关联类型。例如:


trait LendingIterator {    type Item<'a> where Self: 'a;
fn next<'a>(&'a mut self) -> Option<Self::Item<'a>>;}
复制代码


将其与标准 Iterator 的定义进行比较:

pub trait Iterator {    type Item;    ...    fn next(&mut self) -> Option<Self::Item>    ...}
复制代码


如你所见,LendingIterator 使用 Item<'a>而不是非泛型的 Item 相关类型,并将 Self 约束为类型'a。这意味着 next 函数将返回一个从 self 借用的项。


虽然乍一看有些神秘,但 GAT 是一个非常强大的抽象概念,许多 crate 已经在不稳定版本中使用了它。此外,由于 GAT 还不稳定,许多 crate 的进一步开发被阻塞。可以使用 GAT 构建的一些特性包括:用于从 DB 加载数据的零拷贝接口、通用构建模式、表示非拥有值等等。值得注意的是,在某些情况下,GAT 被不安全的代码替代,并且 GAT 可以减少对不安全代码的使用,对于这些情况,Rust 不再提供任何安全性保证。


如前所述,GAT 并不是 Rust 1.65 唯一值得注意的新特性。特别值得一提的还有新的 let-else 语句和使用 break 跳出代码块。


let-else 语句是 let 的扩展,它试图匹配模式,并在找不到匹配时提供要执行的 else 块,例如从函数中提前返回或 panic。


由于循环块支持任意时候跳出循环,标记的 break 让已经使用只执行一次的 loop 块来实现的行为变得更完整了。现在,你还可以标记一个块,然后使用 break <块标记>语句跳转到这个标记块的末尾。


如果你对 Rust 1.65 的详细变更感兴趣,请查看官方发布说明


原文链接:

https://www.infoq.com/news/2022/11/rust-generic-associated-types/


相关阅读:

前端又开撕了:用Rust写的Turbopack,比Vite快10倍?

微软首席工程师Nick Cameron:Rust要想取得更大的成功,需要解决这十大挑战

2022-11-28 09:295121

评论

发布
暂无评论
发现更多内容

ironSource Luna 正式推出针对苹果搜索广告的自动化投放工具

Geek_2d6073

走进直播间——智能自动化助力政企数字化转型

浪潮云

云计算

直播预告 | PolarDB-X 动手实践系列——用 PolarDB-X 搭建一个高可用系统

阿里云数据库开源

MySQL 数据库 阿里云 开源 PolarDB-X

如何使用 Serverless Devs 部署静态网站到函数计算

阿里巴巴云原生

加盟自助洗车需要人工全天看守吗

共享电单车厂家

24小时无人自助洗车 加盟自助洗车

模块三作业

HZ

架构实战营 #架构实战营

自助洗车机洗车多少钱一次?利润有多少

共享电单车厂家

自助洗车加盟 自助洗车机洗车 自助洗车多少钱一次

漏洞挖掘之Spring Cloud注入漏洞

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

PlatoFarm生态NFT总量恒定,激励机制让Dao成员持续贡献

西柚子

开个自助洗车要多少钱?主要费用有哪些?

共享电单车厂家

自助洗车加盟 开个自助洗车

线上活动| 阿里云、亚马逊云与MongoDB的大佬带你来涨知识!

MongoDB中文社区

mongodb

EventBridge 与 FC 一站式深度集成解析

阿里巴巴云原生

技术干货| 如何在MongoDB中轻松使用GridFS?

MongoDB中文社区

mongodb

首届全球基础软件创新大会明天开幕!

OpenAnolis小助手

开源 操作系统 龙蜥社区 国产 基础软件创新大会

基于数据技术全域流量协同优化是银行零售业务关键突破点

易观分析

银行 数据技术

关于 RocketMQ Summit 的延期通知

阿里巴巴云原生

iOS编码规范

刁架构

规范 iOS编码规范

腾讯WeTest通过TMMi 3级认证

WeTest

K8s 基于 EFK 的日志解决方案介绍

移动云大数据

elasticsearch Kibana Fluentd

TASKCTL的单机与分布式部署,如何启动服务和代理节点监听

TASKCTL

批量任务 调度引擎 ETL 自动化运维 调度任务

PlatoFarm生态NFT总量恒定,激励机制让Dao成员持续贡献

小哈区块

TASKCTL 调度高可用架构服务与安装

TASKCTL

kettle 批量任务 调度引擎 ETL 调度任务

元宇宙背景下——内容生产传播商业价值分析2022

易观分析

元宇宙 内容生产传播

快速了解日志概貌,详细解读13种日志模式解析算法

云智慧AIOps社区

算法 运维 安全 监控 日志

无人洗车店生意怎么样?想加盟自助洗车

共享电单车厂家

加盟自助洗车 无人自助洗车加盟 无人洗车店生意

中兴通讯加入星策开源社区 携手推动企业智能化转型建设

星策开源社区

人工智能 机器学习 开源社区 企业转型

Java运算符、输入、选择流程控制详细讲解

五分钟学大数据

Java 4月月更

怎么加盟6元自助洗车?一起来了解下

共享电单车厂家

自助洗车怎么加盟 6元自助洗车 加盟自助洗车 6元自助洗车项目

生产到一半改工艺生产为另一个产品的业务方案探讨

秋去冬来春未远

生产改单 生产执行 生产拆单

花14天梳理了3月份各大厂问得最多的50道Java基础面试题

北游学Java

Java 面试

如何通过 Node 上传小程序代码,不会就看看吧

CRMEB

Rust 1.65引入泛型关联类型,向高级类类型迈进了一步_语言 & 开发_Sergio De Simone_InfoQ精选文章