我正在尝试实现一个单向链表来熟悉Rust编程语言。以下是我的数据结构:
struct Linked<T> {
head: Option<Box<Node<T>>>
}
struct Node<T> {
data: T,
next: Option<Box<Node<T>>>
}
现在,我想给这个添加一个迭代器:
struct LinkedIter<'a, T: 'a> {
node: Option<&'a Node<T>>,
}
我已经为Linked<T>
编写了一个.iter()
方法,它可以编译并正常工作。
impl<T> Linked<T> {
fn iter(&self) -> LinkedIter<T> {
LinkedIter { node: match self.head {
Some(ref node) => Some(&**node),
None => None
}
}
}
}
现在,这个
match
块正在将一个Option<Box<Linked<T>>>
转换为一个Option<&Linked<T>>
。这正是Option::map()
方法的用途。因此,我重新实现了这个方法,使用head.as_ref()
代替head
,以避免在闭包中获取Option
的内容的所有权。impl<T> Linked<T> {
fn iter(&self) -> LinkedIter<T> {
LinkedIter { node:
self.head.as_ref().map(|b: &Box<Node<T>>| &**b)
}
}
}
不幸的是,闭包中创建的引用不能超出闭包的生命周期,因为它引用了作为参数传递给闭包的某些内容。编译器会报错(稍微改述一下):
错误:由于冲突要求,无法推断借用表达式的合适生命周期:
首先,生命周期不能超出匿名生命周期#1的定义[在闭包中]
但是,生命周期必须对[iter函数的生命周期]有效
以使[节点:]表达式可分配
我该如何向编译器解释引用在闭包结束后仍将保持有效?