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

2023-03-29 13:52:58 浏览数 (1)

作者 | Sergio De Simone

译者 | 明知山

策划 | 丁晓昀

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

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

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

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

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

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

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

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

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

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

代码语言:javascript复制
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 要想取得更大的成功,需要解决这十大挑战 (https://www.infoq.cn/article/RgA0yves4Q1FHI9dJlry)

声明:本文为InfoQ翻译,未经许可禁止转载。

点击底部阅读原文访问 InfoQ 官网,获取更多精彩内容!

今日好文推荐

后Kubernetes时代的未来?Wasmer 3.0 发布,可在浏览器外运行 WebAssembly

马斯克要求推特程序员写周报,具体到代码行数;刘强东称将末位淘汰部分京东高管;闰秒终于要被取消了!| Q资讯

阿里云李飞飞:用5年让PolarDB成为“国货之光”| 开源人说

谷歌计划裁员上万人:利用刚上线半年的新绩效系统解雇6%“排名垫底”员工

0 人点赞