写点什么

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

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

    阅读完需:约 4 分钟

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

AI 大模型超全落地场景&金融应用实践,8 月 16 - 19 日 FCon x AICon 大会联诀来袭、干货翻倍!

最新版本的 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:295333

评论

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

产品帮助中心的制作方法及工具推荐

小炮

重点操作之上线、恢复、部署 - 大屏云极简使用手册

shulinwu

程序设计优化之管道数据流

有道技术团队

AI算力加速之道

安第斯智能云

人工智能 深度学习 异构计算

实用机器学习笔记二十四:模型调参

打工人!

学习笔记 机器学习算法 3月月更 模型调参

Go学习笔记——条件判断if

为自己带盐

Go 学习笔记 3月月更

理解Restful风格

蜜糖的代码注释

RESTful 接口规范 REST API 3月月更

CNI 这么多,怎么选?| 容器网络系列第1期

BoCloud博云

Kubernetes 容器云 cni 容器网络平台

科技创新力强,旺链科技创始人刘涛荣登G60科创走廊创业榜单

旺链科技

区块链 产业区块链 创新创业

信息安全无小事!教你如何做日志脱敏

卢永德

AHPA:开启 Kubernetes 弹性预测之门

阿里巴巴云原生

阿里云 Kubernetes 云原生 AHPA 弹性预测

Go实现并发聚合,批量提交功能

人生如梦

Go 并发 请求聚合

用 vite 2 平滑升级 vue 2 + webpack 项目实战

CRMEB

java培训:Redis和Mysql数据怎么保持一致

@零度

MySQL redis JAVA开发

华为SmartCare和AUTIN品牌升级:助力运营商走出5G发展迷宫

白洞计划

URL重定向及跳转漏洞

喀拉峻

网络安全

毕业总结

皓月

「架构实战营」

豆瓣9.6分,Scala编程圣经第5版重磅来袭!

博文视点Broadview

操作系统面试总结

yuexin_tech

操作系统

电商秒杀系统架构设计文档

皓月

「架构实战营」

毕业总结

whoami

架构训练营

39 个 Java 集合框架面试题

逆锋起笔

java面试 死磕 Java 基础 3月月更 Java集合框架

尚硅谷Maven新版视频教程发布

@零度

maven

虎符交易所完成2月HOO回购 HOO单月涨幅高达40%

区块链前沿News

Hoo 虎符交易所 平台币

DNA to Face,会是寻人缉凶的一颗“银弹”吗?

脑极体

Python 获取字典中的第一个键

AlwaysBeta

Python 程序员 编程语言 字典

Java 8 Stream 从入门到进阶——像SQL一样玩转集合

翊君

Java JAVA stream

优雅的DO,VO,DTO转换工具MapStruct

卢永德

3月月更

知识管理的成功案例大赏

小炮

程序员硬核测评:全方位测评 GaussDB(for Redis) 和开源 Redis

华为云数据库小助手

性能分析 GaussDB GaussDB ( for Redis ) 华为云数据库 开源Redis

一文带你了解动态数组方法实现

xiaoyu

数据结构 算法 数组 java; 动态数组

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