探索AIGC电商新纪元,火山引擎《云上新视界》公开课等你来报名! 了解详情
写点什么

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

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

    阅读完需:约 4 分钟

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

《企业级 Agents 开发实战营》重磅上线,10 周带你进行工具、对话及多模态等不同类型 Agents 工程化开发实战!

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

评论

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

2022前端面试必备题+答案

buchila11

架构实战营 作业 模块一

脉醉

#架构实战营

Rust从0到1-Cargo-自定义命令

rust cargo 自定义命令 Custom Commands

AI星海中的“中国空间站”:昇腾如何助力鹏城云脑Ⅱ实现全球领航

脑极体

网络攻防学习笔记 Day65

穿过生命散发芬芳

网络攻防 7月日更

“无法运行Windows 11”?最靠谱的升级方案来了!

Jackpop

windows windows 11

Linux之find命令

入门小站

Linux

程序员跳槽指南

孙叫兽

程序员 跳槽 攻略

Redisson 分布式锁源码 04:可重入锁释放

程序员小航

Java redis 分布式锁 redisson redisson 分布式锁

架构实战课-模块1作业

Nullrable

学习

Rust从0到1-Cargo-Workspaces

rust cargo workspaces

太好用!教你几招Python魔法方法的妙用

Jackpop

Python 数据分析 后端

架构实战营 - 模块1 - 微信架构及学生管理系统毕设架构

雪中亮

架构实战营 #架构实战营

开发小技巧之:unicode的排序和正则匹配

程序那些事

Unicode 排序 程序那些事

接下来的两个月又要忙了

IT蜗壳-Tango

7月日更

模块1.架构设计

脉动

Google 宣布 Android APK 退位对鸿蒙意味着什么?|【话题讨论】

老猿Python

android 鸿蒙 Google AAB格式

吴恩达Andrew Ng Coursera学习总结合集,编程作业技巧合集 John 易筋 ARTS 打卡 Week 54

John(易筋)

ARTS 打卡计划

滴滴出行因违规收集个人信息被下架:必须整治鱼龙混杂的应用市场

石头IT视角

C++ for Financial Mathematics读书笔记

bobcatzoo

c++ 金融

从大厂不允许使用 SELECT * 说开去

喵叔

7月日更

在线HTTP请求/响应头转JSON工具

入门小站

工具

🏆【算法数据结构专题】「线程锁算法专项」初探CLH队列锁机制原理分析

洛神灬殇

AQS 数据结构与算法 CLH 7月日更

浏览器历史难题解决了....

Jackpop

chrome chrome扩展

5款最强且免费的Python IDE

Jackpop

sublime-text vscode #python

学习哪门编程语言好,我来回答

实力程序员

推荐系统的人工调控策略(二十八)

数据与智能

推荐系统 策略模式

面试官问我会canvas? 我可以绘制一个烟花🎇动画

阿飞

大前端 动画 SVG 数据可视化 canvas

架构实战营-模块一作业

李东旭

架构实战营

架构实战营 模块一 作业

一雄

架构实战营 模块一

炫酷!一款有颜又强大的Python工具包

Jackpop

Python 开发工具

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