gpt4 book ai didi

rust - 为什么在涉及 += 运算符的同一表达式中使用可变引用和不可变引用有时似乎被允许,有时则不允许?

转载 作者:行者123 更新时间:2023-12-05 08:46:53 27 4
gpt4 key购买 nike

在下面的代码示例中,我试图通过对它的可变引用以四种不同的方式增加结构 X 的成员变量 a。此处,编译器针对 B 表示的行给出以下错误:

error[E0502]: cannot borrow `*x` as immutable because it is also borrowed as mutable
--> src\main.rs:17:23
|
17 | *x.get_a_mut() += x.get_a(); //B DOESN'T COMPILE
| ------------------^--------
| || |
| || immutable borrow occurs here
| |mutable borrow occurs here
| mutable borrow later used here

如果在同一表达式中使用对a 的可变引用和不可变引用是一个问题,为什么CD 编译?

struct X {
a: i64,
}

impl X {
pub fn get_a_mut(&mut self) -> &mut i64 {
return &mut self.a;
}

pub fn get_a(&self) -> &i64 {
return &self.a;
}
}

fn my_fn(x: &mut X) {
*x.get_a_mut() += 5; //A
*x.get_a_mut() += x.get_a(); //B DOESN'T COMPILE
*x.get_a_mut() += 2 * x.get_a(); //C
*x.get_a_mut() = x.get_a() + x.get_a(); //D
}

fn main() {
let mut x = X { a: 50 };
my_fn(&mut x);
}

最佳答案

根据 += documentation ,如果 Badd_assign(lhs: &mut i64, rhs: i64 )ACD 情况下。

A情况下,rhs是常量,不同于x.a;没问题。

C的情况下,rhs是临时的(2 * x.get_a()的结果),不需要保留对 x.a 的引用存在;没问题。

如果 Drhs 是临时的(x.get_a() + x.get_a() 的结果)并且确实不需要保留对 x.a 的引用;没问题。

但是当涉及到案例B时,rhs x.a的引用;然后此调用同时对同一数据 (x.a) 使用可变 (lhs) 和不可变 (rhs) 引用,这被禁止。

您最终可以克隆 rhs:*x.get_a_mut() += x.get_a().clone()

关于rust - 为什么在涉及 += 运算符的同一表达式中使用可变引用和不可变引用有时似乎被允许,有时则不允许?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68879786/

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