Rust ARC中的元组是如何通过引用进行分解的?

Rust ARC中的元组是如何通过引用进行分解的?,rust,tuples,destructuring,reference-counting,Rust,Tuples,Destructuring,Reference Counting,我正在查看,很好奇元组对和对是如何被分解的: let pair=Arc::new((Mutex::new(false),Condvar::new()); 让pair2=pair.clone(); // ... 线程::生成(移动| |{ let&(ref lock,ref cvar)=&*pair2; // ... } Arc是否返回对内部数据的引用?但是从pair2中删除&: let&(ref-lock,ref-cvar)=*pair2; 给出一个编译器错误: 11 | let&(ref

我正在查看,很好奇元组
是如何被分解的:

let pair=Arc::new((Mutex::new(false),Condvar::new());
让pair2=pair.clone();
// ...
线程::生成(移动| |{
let&(ref lock,ref cvar)=&*pair2;
// ...
}
Arc
是否返回对内部数据的引用?但是从
pair2
中删除
&

let&(ref-lock,ref-cvar)=*pair2;
给出一个编译器错误:

11 | let&(ref lock,ref cvar)=*pair2;
|^^^^^^^^^^^^^^^^^^^^^^^^^^^所需的元组,已找到引用
|
=注意:应为类型“”(std::sync::Mutex,std::sync::Condvar)`
找到类型`&_`

这似乎意味着
*pair2
返回一个元组而不是一个引用。

简短的回答是肯定的,
Deref
返回一个引用,但该引用仍然被
*
取消引用

在破译
和*pair
之前,首先详细查看
*pair

Arc
实现了
Deref
特性,因此Rust编译器本质上转换:

*对
进入

*(pair.deref())
Arc::deref()
确实返回一个引用,但它将被
*
取消引用,从而生成一个元组

Condvar
示例添加了一个前导的
&
,因为它只需要借用
*pair
产生的元组

另见:

  • Deref::Deref
  • 这个

简短的回答是肯定的,
Deref
返回一个引用,但该引用仍然被
*
取消引用

在破译
和*pair
之前,首先详细查看
*pair

Arc
实现了
Deref
特性,因此Rust编译器本质上转换:

*对
进入

*(pair.deref())
Arc::deref()
确实返回一个引用,但它将被
*
取消引用,从而生成一个元组

Condvar
示例添加了一个前导的
&
,因为它只需要借用
*pair
产生的元组

另见:

  • Deref::Deref
  • 这个

您的问题似乎可以用的答案来回答。如果答案不是,请您的问题解释差异。否则,我们可以将此问题标记为已回答。很难在一篇文章中回答多个问题。请将它们分成多个问题,以便我们能更好地帮助您,并使您的问题得到解决l将来帮助其他与您有相同问题的人!第二个问题(“这些变体为什么会起作用”)的答案可能是;;。您可以更进一步:
let(lock,cvar)=&*pair;
Hi@Shepmaster,感谢您的快速回复!让我花一些时间来消化您提供的链接。您的问题似乎可以通过的答案来回答。如果没有,请您的问题解释差异。否则,我们可以将此问题标记为已回答。很难回答o中的多个问题ne post。请将它们分为多个问题,这样我们可以更好地帮助您,并且您的问题将在将来帮助其他与您有相同问题的人!看起来您的第二个问题(“这些变体为什么有效”)可能会由;;.的答案回答。您可以更进一步:
let(lock,cvar)=&*pair;
Hi@Shepmaster,感谢您的快速回复!让我花点时间来消化一下您提供的链接。