上一章
CH.064 小时实战: 词频统计器

泛型、Trait 与生命周期

零成本抽象与引用安全的秘密

泛型:写一次,处理多种类型

对比:泛型函数
JS
TypeScript
function 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 与迭代器
20 分钟精讲
0:00 / 0:00
CC
零成本抽象原理、Trait 对象 vs 泛型、迭代器惰性求值的性能优势。