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 }。如果希望 xy 类型不同,可写 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)
若函数签名中遵守规则,则可省略生命周期标注;但若返回引用或参数复杂,就需要手动。
 
《Rust 程序设计语言》(11/22)《Rust 程序设计语言》(9/22)
Loading...