type
Post
date
Nov 4, 2025
slug
Rust/notebook/10
summary
学习下 Rust 圣经,记录笔记
status
Published
tags
Rust
category
技术茶点
icon
password
Rust 中的泛型(Generics)是一个强大的特性,允许开发者编写 不依赖于特定数据类型 的抽象定义,以消除代码重复并提供更大的灵活性,它通过在函数签名、结构体、枚举和方法中使用类型参数(通常是
<T>)来实现。Rust 在编译时通过 单态化(Monomorphization) 过程,将泛型代码替换为针对每个具体类型实例化的特定代码,从而确保了泛型具有 零成本抽象 的优点,即在运行时没有性能开销。10.泛型、Trait 和生命周期
10.1.泛型数据类型
概念 | 含义 | 关键点 |
泛型(generics) | 在类型、函数、结构体等定义中使用占位类型,使得代码可以适用于多种具体类型。 (doc.rust-lang.org) | 在函数或类型名字后加上 <T>、<T, U> 等。 |
在函数中使用泛型 | 在函数签名中指定一个或多个类型参数,使函数能够处理不同类型。 (doc.rust-lang.org) | 例如: fn largest<T>(list: &[T]) -> &T { … }。但要注意:如果在函数体中使用比较、复制等操作,则对 T 类型会有额外限制。 (Massachusetts Institute of Technology) |
在结构体/枚举中使用泛型 | 定义结构体或枚举时,在名字后加入 <T> 等,使其字段或变体可以是任意类型。 (rust-book.cs.brown.edu) | 例如: struct Point<T> { x: T, y: T }。如果希望 x 和 y 类型不同,可写 struct Point<T, U> { x: T, y: U }. |
类型参数约束(trait bounds) | 当泛型类型需要具有某些特性(如可比较、可拷贝)时,应在签名中添加约束。 (doc.rust-lang.org) | 如: fn largest<T: PartialOrd>(list: &[T]) -> &T { … }。 |
编译时单态化(monomorphization) | 使用泛型不会牺牲运行时性能。编译器会为具体类型生成优化后的代码。 (itfanr.gitbooks.io) | 所以泛型在 Rust 中既灵活又高效。 |
10.2.Trait:定义共同行为
概念 | 含义 | 关键点 |
Trait 定义 | trait 是定义一组方法签名的机制,用来描述不同类型之间共享的行为。 (doc.rust-lang.org) | 用法示例: pub trait Summary { fn summarize(&self) -> String; } (doc.rust-lang.org) |
在类型上实现 Trait | 对某个结构体或枚举实现 trait,类型就获得该行为。 (doc.rust-lang.org) | 示例: impl Summary for NewsArticle { fn summarize(&self) -> String { … } } (doc.rust-lang.org) |
Trait 绑定(trait bounds) | 在泛型函数或结构体中,可用 trait 绑定限定类型必须实现某个 trait,以确保可调用对应方法。 (doc.rust-lang.org) | 例如: fn notify(item: &impl Summary) { … } 或更完整:fn notify<T: Summary>(item: &T) { … } |
默认方法实现 | trait 中可以为方法提供默认实现,使类型在实现时可以直接使用或覆盖。 (rust-book.cs.brown.edu) | 如果类型只需默认行为,就无需在 impl 中再定义该方法。 |
何时使用 Trait | 当希望不同类型共享某种行为但不共享数据结构时,用 trait 抽象接口。 | trait 类似于其他语言的接口(interfaces),但在 Rust 中与泛型和类型系统紧密结合。 (doc.rust-lang.org) |
10.3.生命周期确保引用有效
概念 | 含义 | 关键点 |
生命周期(lifetime) | 每个引用在 Rust 中都有一个生命周期,即该引用「有效」的作用域。 (Massachusetts Institute of Technology) | 虽然大部分情况下编译器可推断,但在多引用相互关系不明确时,需要手动标注。 (doc.rust-lang.org) |
生命周期参数语法 | 用于标注引用之间生命周期关系的泛型参数。语法为 <'a> 等,标注在函数/结构体签名中。 (rust-book.cs.brown.edu) | 例如 fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { … } 表示返回值的生命周期与参数之一相同。 (doc.rust-lang.org) |
防止悬垂引用 | 生命周期机制让编译器确定引用不会超过其所指向数据的作用域,从而避免悬垂引用。 (Massachusetts Institute of Technology) | 如果尝试返回一个对局部创建值的引用,编译将报错。 (rust-book.cs.brown.edu) |
结构体中的引用字段 | 若结构体包含引用字段,则结构体定义必须标注生命周期参数,说明这些字段的引用至少在某生命周期内有效。 (coreh.github.io) | 例如 struct ImportantExcerpt<'a> { part: &'a str, }。 (rust-book.cs.brown.edu) |
生命周期省略规则(elision) | 在很多常见情形下,Rust 编译器可以根据三条规则自动推断生命周期,从而无需手动标注。 (coreh.github.io) | 若函数签名中遵守规则,则可省略生命周期标注;但若返回引用或参数复杂,就需要手动。 |
- Author:沈林曦
- URL:https://blog.aibhtt.com/article/Rust/notebook/10
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts












