gpt4 book ai didi

reference - 借用 vs 可变借用 一生中奇怪的失败

转载 作者:行者123 更新时间:2023-11-29 07:51:38 26 4
gpt4 key购买 nike

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

这很好用:

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>
}

链接链:

#[deriving(Eq, Clone)]
pub enum LinkedList<T> {
Cell(T, ~LinkedList<T>),
End
}

有关文件的完整 View ,请参阅 https://github.com/TisButMe/rust-algo/blob/mut_iter/LinkedList/linked_list.rs

最佳答案

请注意,对于代码的两个变体位,您遗漏了 LinkedListMutIterator 的定义,这可能与重现和剖析您的问题的任何实际尝试有关。


所以,我将尝试猜测发生了什么。

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

特别是我怀疑借用检查器在提示,因为它试图确保您没有创建多个别名相同状态的可变借用。

  • 对同一个状态有多个不可变借用是合理的...

  • ... 但是你不能对同一个状态有多个可变借用(因为我们想确保如果你有一个对某个状态的 &mut 引用,那么那个引用是改变状态的唯一方法)。

关于reference - 借用 vs 可变借用 一生中奇怪的失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20993909/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com