gpt4 book ai didi

pointers - 奇怪的借用检查失败

转载 作者:行者123 更新时间:2023-11-29 08:06:58 26 4
gpt4 key购买 nike

我大致有以下代码:

let val = util::replace(&mut self.some_field[i], self.some_method());

失败并显示以下消息:

unrelated.rs:61:65: 61:70 error: cannot borrow `*self` as immutable because it is also borrowed as mutable
unrelated.rs:61 let val = util::replace(&mut self.some_field[i], self.some_method());
^~~~~
unrelated.rs:61:36: 61:62 note: second borrow of `*self` occurs here
unrelated.rs:61 let val = util::replace(&mut self.some_field[i], self.some_method());
^~~~~~~~~~~~~~~~~~~~~~~

我可以通过以下代码解决这个问题:

let temp = self.some_method();
let val = util::replace(&mut self.some_field[i], temp);

但是为什么会失败呢?可变指针和不可变指针所处的范围是不同的,它们是不同的表达式。对我来说这看起来有点像错误,但我只是想确保我没有遗漏任何东西。

最佳答案

通过引入 temp,你改变了计算顺序:你首先计算 some_method(),然后释放 self,然后得到一个可变的引用 selfsome_field

Rust 不允许将可变引用与任何其他引用(可变或不可变)一起持有。查看更简单的示例:

struct Foo {
a: int
}

impl Foo {
fn ff(&self) -> int { 1 }
}

fn fff(a: int, foo: &mut int) { }
fn ggg(foo: &mut int, a: int) { }

fn main() {
let mut foo = Foo { a: 0 };
fff(foo.ff(), &mut foo.a); // this call is valid
ggg(&mut foo.a, foo.ff()); // this is not
}

关于pointers - 奇怪的借用检查失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18083784/

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