【发布时间】:2020-06-06 12:45:31
【问题描述】:
我试图在函数调用中可变地借用一个结构及其一些成员。看到结构的第一个可变借用,任何后续借用(成员的)都标记为错误second mutable borrow occurs here
场景很简单,我们有一个保存状态的结构体:
struct State {
a: i32,
b: i32,
result_add: i32,
result_subtract: i32
}
还有一个函数,根据传递的成员(在我们的例子中为a和b)填充结构中result_add和result_subtract的计算
fn do_calc(state : & mut State, var1 : &mut i32, var2: &mut i32) {
*var1 = 4;
*var2 = 2;
state.result_add = state.a + state.b;
state.result_subtract = state.a - state.b;
}
有点人为的例子,但想法是var1 和var2 也可以是其他结构成员。现在我们调用:
do_calc(&mut state, &mut state.a, &mut state.b);
并得到错误:
error[E0499]: cannot borrow `state.a` as mutable more than once at a time
--> src/main.rs:24:25
|
24 | do_calc(&mut state, &mut state.a, &mut state.b);
| ------- ---------- ^^^^^^^^^^^^ second mutable borrow occurs here
| | |
| | first mutable borrow occurs here
| first borrow later used by call
我猜编译器看到我们多次借用结构并停止它,但如果整个结构是可变的,这不应该吗?
一种解决方案是删除结构引用并借用每个需要变异的字段:
fn do_calc(result_add : &mut i32, result_subtract : &mut i32, var1 : &mut i32, var2: &mut i32)
这可行,但对于更复杂且非常奇怪的事情来说很麻烦。除了以可变方式借用整个结构同时还借用其成员之外,还有其他方法吗?
【问题讨论】:
标签: rust