第 11 章 特型与泛型(2)
吉姆•布兰迪
11.4 定义类型之间关系的特型
迄今为止,我们看到的每个特型都是独立的:特型是类型可以实现的一组方法。特型也可以用于多种类型必须协同工作的场景中。它们可以描述多个类型之间的关系。
std::iter::Iterator 特型会为每个迭代器类型与其生成的值的类型建立联系。
std::ops::Mul 特型与可以相乘的类型有关。在表达式 a * b 中,值 a 和 b 可以是相同类型,也可以是不同类型。
rand crate 中包含随机数生成器的特型(rand::Rng)和可被随机生成的类型的特型(rand::Distribution)。这些特型本身就准确地定义了它们是如何协同工作的。
你不需要每天都创建这样的特型,但它们在整个标准库和第三方 crate 中随处可见。本节将展示每一个示例是如何实现的,并根据需要来展开讲解相关的 Rust 语言特性。你需要掌握的关键技能是能够阅读这些特型和方法签名,并理解它们对所涉及的类型意味着什么。
11.4.1 关联类型(或迭代器的工作原理)
接下来我们从迭代器讲起。迄今为止,每种面向对象的语言都内置了某种对迭代器的支持,迭代器是用以遍历某种值序列的对象。
Rust 有一个标准的 Iterator 特型,定义如下:
这个特型的第一个特性(type Item;)是一个关联类型。实现了 Iterator 的每种类型都必须指定它所生成的条目的类型。
第二个特性(next() 方法)在其返回值中使用了关联类型。next() 会返回一个 Option<Self::Item>:或者是序列中的下一个值 Some(item),或者当没有更多值可供访问时返回 None。该类型要写成 Self::Item,而不仅仅是无修饰的 Item,因为这里的 Item 是每个迭代器类型下的一个特性,而不是一个独立的类型。同样,self 和 Self 类型在代码中任何使用了其字段、方法等的地方都要像这样显式写出来。
下面是为一个类型实现 Iterator 的范例:
std::env::Args 是我们在第 2 章中用来访问命令行参数的标准库函数 std::env::args() 返回的迭代器类型。它能生成 String 值,因此这个 impl 声明了 type Item = String;。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Rust中的特型与泛型是编程中重要的概念。特型描述了类型之间的关系,如迭代器特型描述了迭代器类型与其生成的值类型之间的关系。而泛型是一种通用的编程方式,适用于多种类型。本文重点介绍了关联类型的概念,以及如何在泛型代码中使用关联类型。此外,还介绍了泛型特型的概念,以及如何在Rust中实现运算符重载。通过具体的代码示例,读者可以了解如何在Rust中使用特型和泛型来描述类型之间的关系,以及如何在实际编程中应用它们。另外,文章还介绍了Rust中的impl Trait特性,以及关联常量的使用。这些概念和技术对于理解Rust语言的特性和进行高效的编程非常重要。在接下来的章节中,将进一步讨论在Rust代码中使用特型和泛型的多种方式,以及它们在闭包、迭代器、输入/输出和并发等主题中的核心角色。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 程序设计(第 2 版)》
《Rust 程序设计(第 2 版)》
立即购买
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论