我很难理解如何在 Mutex 中修改 Option。
当没有 Option 时,它可以正常工作。
let mut my_int = Arc::new(Mutex::new(5));
let my_int_clone = Arc::clone(&my_int);
thread::spawn(move || {
let mut my_int = my_int_clone.lock().unwrap();
*my_int += 1;
}).join();
let my_int_clone_print = Arc::clone(&my_int);
println!("Value: {}", my_int_clone_print.lock().unwrap());
然而,当我将值包装在Some
中时,我不得不手动使用ref mut
等(我从这里找到了方法),因为lock().unwrap()
返回的是MutexGuard
,而不是Option
本身。
let mut my_int = Arc::new(Mutex::new(Some(5)));
let my_int_clone = Arc::clone(&my_int);
thread::spawn(move || {
let mut my_int = my_int_clone.lock().unwrap();
match *my_int {
Some(ref mut val) => {
*val += 1;
},
None => {
println!("Value is None. Doing nothing..");
}
}
}).join();
let my_int_clone_print = Arc::clone(&my_int);
println!("Value: {}", my_int_clone_print.lock().unwrap());
你有没有想过是哪个Rust概念导致了这个问题?除了
Option
返回MutexGuard
而不是原始值之外,还有哪些数据类型会这样做?