泛型:写一次,处理多种类型
对比:泛型函数
JS
TypeScriptfunction largest<T extends number | string>(list: T[]): T {
return list.reduce((a, b) => a > b ? a : b);
}Rs
Rust// T: PartialOrd 是 Trait 约束,相当于 TypeScript 的 extends
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in list {
if item > largest {
largest = item;
}
}
largest
}→
Rust 泛型在编译时单态化——为每种实际类型生成专用代码,不是运行时多态,没有虚函数调用的开销。这就是零成本抽象。
Trait:定义共享行为
Trait 类似 TypeScript interface,但可以有默认实现:
trait Summary {
fn author(&self) -> String; // 必须实现
// 默认实现
fn summarize(&self) -> String {
format!("作者:{}", self.author())
}
}
struct Article { title: String, author: String }
struct Tweet { username: String, content: String }
impl Summary for Article {
fn author(&self) -> String { self.author.clone() }
// 使用 summarize 的默认实现
}
impl Summary for Tweet {
fn author(&self) -> String { format!("@{}", self.username) }
fn summarize(&self) -> String {
format!("@{}: {}", self.username, self.content)
}
}函数参数接受任意实现了 Trait 的类型:
fn notify(item: &impl Summary) {
println!("{}", item.summarize());
}迭代器:惰性高性能链式操作
对比:集合操作
JS
JavaScript// 三次遍历,三次中间数组
const result = [1,2,3,4,5,6,7,8,9,10]
.filter(x => x % 2 === 0)
.map(x => x * x)
.slice(0, 3);Rs
Rust// 惰性求值,collect 时才触发,只遍历一次
let result: Vec<i32> = (1..=10)
.filter(|x| x % 2 == 0) // 适配器:惰性
.map(|x| x * x) // 适配器:惰性
.take(3) // 适配器:惰性
.collect(); // 消费器:触发执行→
Rust 迭代器是惰性的,整个链只遍历一次,而且 LLVM 通常能自动 SIMD 向量化。比 JS 的 Array 方法链效率高得多。
常用迭代器方法:
let v = vec![1, 2, 3, 4, 5];
v.iter().sum::<i32>() // 15
v.iter().any(|&x| x > 3) // true
v.iter().all(|&x| x > 0) // true
v.iter().max() // Some(5)
v.iter().enumerate().for_each(|(i, x)| println!("{}: {}", i, x));
v.iter().zip(&v).map(|(a, b)| a + b).collect::<Vec<_>>();
v.iter().fold(0, |acc, x| acc + x) // 15(同 reduce)常用 Derive Trait
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
struct Config {
host: String,
port: u16,
}#[derive] 宏自动实现常用 Trait,不需要手写样板代码。
实战项目:词频统计器
实战项目
词频统计器
45 分钟中级
输入文本,用迭代器链式操作统计词频,输出 Top 10 高频词。全程不写一行 for 循环。
迭代器链式操作HashMap foldsort_by 自定义排序闭包捕获
cargo new word-freq && cd word-freq实战视频
泛型、Trait 与迭代器
0:00 / 0:00CC
零成本抽象原理、Trait 对象 vs 泛型、迭代器惰性求值的性能优势。