// 定义泛型结构体
struct Container<T> {
value: T,
}
// 为泛型结构体实现transform方法
impl<T> Container<T> {
fn transform<F, U>(self, f: F) -> Container<U>
where
F: FnOnce(T) -> U,
{
Container { value: f(self.value) }
}
}
// 为Container<i32>实现sum_square方法
impl Container<i32> {
fn sum_square(&self) -> i32 {
self.value * self.value
}
}
// 复用代码逻辑方面,可以将通用的逻辑放在泛型impl块中,特定类型的impl块继承泛型impl块的能力,只实现特定类型的方法。例如在这个例子中,transform方法是通用的,sum_square方法是特定于i32类型的。
// 类型约束的重要性:在transform方法中,通过where子句对闭包F进行类型约束,确保闭包能正确接受T类型参数并返回U类型值,这保证了类型安全。如果没有正确的类型约束,编译器无法确保传递的闭包能正确处理结构体中的数据类型,可能导致编译错误。
// 生命周期标注的重要性:在这个例子中,sum_square方法使用了&self,表明该方法不会获取self的所有权,这样调用者在调用该方法后仍然可以继续使用该结构体实例。如果没有正确的生命周期标注,编译器无法确定借用关系,可能会导致悬垂引用等错误。