当我试图实现一个迭代器来产生链表元素的可变引用时,我偶然发现了一个奇怪的问题。
这可以很好地工作:
impl<'a, T> Iterator<&'a T> for LinkedListIterator<'a, T>{
fn next(&mut self) -> Option<&'a T> {
match self.current {
&Cell(ref x, ref xs) => {self.current = &**xs; Some(x)},
&End => None
}
}
}但这不起作用;编译器说self的生命周期太短,不能保证其内容可以安全地重新借用:
impl<'a, T> Iterator<&'a mut T> for LinkedListMutIterator<'a, T>{
fn next(&mut self) -> Option<&'a mut T> {
match self.current {
&Cell(ref mut x, ref mut xs) => {self.current = &mut **xs; Some(x)},
&End => None
}
}
}我希望两个示例都能工作,或者两者都不能工作,但我不能理解借用可变与非可变的东西会如何影响编译器检查生命周期的方式。当然,如果某个东西的寿命足够长,可以安全地借出,那么它的寿命就会足够长,可以安全地可变地借出吗?
编辑:下面是两个迭代器的定义:
pub struct LinkedListIterator<'a, T>
current: &'a LinkedList<T>
}
pub struct LinkedListMutIterator<'a, T> {
current: &'a mut LinkedList<T>
}LinkedLisk:
#[deriving(Eq, Clone)]
pub enum LinkedList<T> {
Cell(T, ~LinkedList<T>),
End
}有关该文件的完整视图,请参阅https://github.com/TisButMe/rust-algo/blob/mut_iter/LinkedList/linked_list.rs
发布于 2014-01-09 08:44:06
注意,您遗漏了这两段代码的LinkedListMutIterator定义,这可能与重现和剖析您的问题的任何实际尝试相关。
所以,我会试着猜测到底是怎么回事。
这里的编译器错误消息可能会误导您;除了self的生命周期之外,还有其他因素可能与此相关。
特别是,我怀疑借入检查器在抱怨,因为它试图确保您不会创建多个以相同状态为别名的可变借入。
&mut引用,则该引用是更改该状态的唯一方法)。https://stackoverflow.com/questions/20993909
复制相似问题