第 9 章:泛型、Trait 与宏
第 9 章:泛型、Trait 与宏
9.1 泛型基础
泛型允许编写可重用代码。
fn largest<T: PartialOrd>(list: &[T]) -> &T {
let mut largest = &list[0];
for item in list.iter() {
if item > largest {
largest = item;
}
}
largest
}
- 使用
T表示类型参数 PartialOrd是类型约束
9.2 Trait 定义与实现
Trait 是行为抽象。
trait Summary {
fn summarize(&self) -> String;
}
struct NewsArticle {
headline: String,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!("{}", self.headline)
}
}
- Trait 可以定义默认方法
- 多个类型可以实现相同 Trait
9.3 常用标准 Trait
Display:用户友好输出Debug:调试格式Clone:显式复制Into/From:类型转换
impl fmt::Display for Point {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "({}, {})", self.x, self.y)
}
}
9.4 宏基础
macro_rules!
macro_rules! create_function {
($func_name:ident) => {
fn $func_name() {
println!("Function {:?} called", stringify!($func_name));
}
};
}
create_function!(foo);
macro_rules!用于定义声明宏- 宏是编译时代码生成工具
9.5 过程宏概念
过程宏可以生成更复杂代码,例如 derive 宏。
#[derive(Debug)]#[derive(Serialize, Deserialize)]
9.6 练习
- 为自定义结构体实现
Display - 编写一个泛型函数处理不同类型的集合
- 创建一个简单宏,生成 getter 方法
浙公网安备 33010602011771号