use std::sync::Mutex;
struct N {
a: i32,
b: i32,
}
fn main() {
let mut n = N { a: 0, b: 0 };
let a = &n.a;
let b = &mut n.b;
println!("{a} {b}");// 编译正常
// =============================
let n = Mutex::new(N { a: 0, b: 0 });
let mut n = n.lock().unwrap();
let a = &n.a;
let b = &mut n.b; // 编译失败
println!("{a}, {b}");
}
1
共 4 条评论, 1 页
评论区
写评论https://rustcc.cn/article?id=dda99bbb-9651-42c9-86e8-3f1fb3e227fd
前几天也有人对RefCell::borrow_mut返回结果提出了同样的问题,可以参考下回复;
重新借用应该是个可行的方式
我懂了, 那么这种case有什么推荐做法么
--
👇
ctj12461: 因为
lock()
返回的实际上是MutexGuard<T>
,其实现了Deref
与DerefMut
。这里的
a
、b
都是自动解引用得来的,所以编译器分析时就发现先借用了MutexGuard<T>
,又可变借用了MutexGuard<T>
。因为
lock()
返回的实际上是MutexGuard<T>
,其实现了Deref
与DerefMut
。这里的
a
、b
都是自动解引用得来的,所以编译器分析时就发现先借用了MutexGuard<T>
,又可变借用了MutexGuard<T>
。