Rustlings线程练习,为什么我不去引用互斥体(Struct)?

Rustlings线程练习,为什么我不去引用互斥体(Struct)?,rust,dereference,Rust,Dereference,我正在学习生锈,没有螺纹方面的经验。我正在学习Rustlings课程,我已经解决了threads1.rs练习,但我不明白为什么我的Mutex结构不需要取消引用 使用std::sync::{Arc,Mutex}; 使用std::线程; 使用std::time::Duration; 结构作业状态{ 完成的工作:u32, } fn main(){ 让status=Arc::new(Mutex::new(JobStatus{jobs_completed:0})); let status_shared=A

我正在学习生锈,没有螺纹方面的经验。我正在学习Rustlings课程,我已经解决了
threads1.rs
练习,但我不明白为什么我的
Mutex
结构不需要取消引用

使用std::sync::{Arc,Mutex};
使用std::线程;
使用std::time::Duration;
结构作业状态{
完成的工作:u32,
}
fn main(){
让status=Arc::new(Mutex::new(JobStatus{jobs_completed:0}));
let status_shared=Arc::clone(&status);
线程::生成(移动| |{
对于0..10中的uu{
线程::睡眠(持续时间::从_毫秒(250));
让mut status_shared=status_shared.lock().unwrap();
status\u shared.jobs\u completed+=1;//为什么不*status\u shared?
}
});
让多个作业完成:u32;
环路{
jobs_completed=状态.lock().unwrap().jobs_completed;
如果作业完成时间<10{
println!(“等待…({}作业完成)”,作业完成;
线程::睡眠(持续时间::从_毫秒(500));
}否则{
打破
}
}
}
根据这本书的内容,我本以为需要分配给

*状态\u已共享。作业\u已完成
要进入
作业\u completed
字段,但会产生错误:

error[E0614]: type `u32` cannot be dereferenced
  --> src/main.rs:16:13
   |
16 |             *status_shared.jobs_completed += 1;
   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这本书给出了一个指向简单类型的指针,而上面的代码给出了一个指向结构的引用,这两者的区别是什么?

通过trait自动取消引用

参考资料:


共享状态
属于
MutexGuard
类型
MutexGuard
实现和特征,deref目标为
T
(在您的情况下,该类型存储在Mutex-
JobStatus
中)

当您在对象后面使用
时,rust编译器将自动尝试将其解引用到可以执行请求操作的地方。因此,此处不需要显式解引用。此行为在的rust手册中描述为@Matthias247,在对象后面时,解引用是自动的

此外,您尝试显式取消引用失败,因为运算符优先级:
*状态共享。作业完成
相当于
*(状态共享。作业完成)
,因此它尝试取消引用
u32
并失败,但您希望
(*状态共享).jobs_已完成
,以便取消对
弧的引用