// 定义MyList链表结构
struct MyList<T> {
head: Option<Box<Node<T>>>,
}
struct Node<T> {
value: T,
next: Option<Box<Node<T>>>,
}
impl<T> MyList<T> {
// 构造函数
fn new() -> MyList<T> {
MyList { head: None }
}
// 添加元素到链表头部
fn push(&mut self, value: T) {
let new_node = Box::new(Node {
value,
next: self.head.take(),
});
self.head = Some(new_node);
}
// filter方法实现
fn filter<F>(&self, f: F) -> MyList<T>
where
F: FnMut(&T) -> bool,
{
let mut result = MyList::new();
let mut current = &self.head;
while let Some(node) = current {
if (f)(&node.value) {
result.push(node.value.clone());
}
current = &node.next;
}
result
}
}
泛型类型约束处理阐述
- 闭包类型约束:在
filter
方法的定义中,使用where
子句对闭包F
进行类型约束。F: FnMut(&T) -> bool
表示闭包F
必须是一个可以接受&T
类型参数(即链表元素的引用)并返回bool
类型结果的可调用对象。这样确保闭包可以正确作用于链表中的元素类型T
。
- 泛型一致性:整个
MyList
结构及其方法都是在泛型参数T
的基础上定义的。filter
方法返回的新MyList
也使用相同的泛型参数T
,保证了类型的一致性。在闭包调用(f)(&node.value)
时,node.value
的类型是T
,与闭包参数类型约束&T
相匹配,从而确保闭包能正确处理链表中的元素。