首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >借用vs可变借用生命中的奇怪失败

借用vs可变借用生命中的奇怪失败
EN

Stack Overflow用户
提问于 2014-01-08 19:10:14
回答 1查看 322关注 0票数 5

当我试图实现一个迭代器来产生链表元素的可变引用时,我偶然发现了一个奇怪的问题。

这可以很好地工作:

代码语言:javascript
复制
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的生命周期太短,不能保证其内容可以安全地重新借用:

代码语言:javascript
复制
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
        }
    }
}

我希望两个示例都能工作,或者两者都不能工作,但我不能理解借用可变与非可变的东西会如何影响编译器检查生命周期的方式。当然,如果某个东西的寿命足够长,可以安全地借出,那么它的寿命就会足够长,可以安全地可变地借出吗?

编辑:下面是两个迭代器的定义:

代码语言:javascript
复制
pub struct LinkedListIterator<'a, T> 
    current: &'a LinkedList<T>
}

pub struct LinkedListMutIterator<'a, T> {
    current: &'a mut LinkedList<T>
}

LinkedLisk:

代码语言:javascript
复制
#[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

EN

回答 1

Stack Overflow用户

发布于 2014-01-09 08:44:06

注意,您遗漏了这两段代码的LinkedListMutIterator定义,这可能与重现和剖析您的问题的任何实际尝试相关。

所以,我会试着猜测到底是怎么回事。

这里的编译器错误消息可能会误导您;除了self的生命周期之外,还有其他因素可能与此相关。

特别是,我怀疑借入检查器在抱怨,因为它试图确保您不会创建多个以相同状态为别名的可变借入。

  • 对同一状态有多个不可变的借用是合理的...
  • ...但是您不能对同一段状态有多个可变借用(因为我们希望确保,如果您有对某个状态的&mut引用,则该引用是更改该状态的唯一方法)。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20993909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档