我正在看Condvar
example,很好奇元组pair
和pair2
的结构:
let pair = Arc::new((Mutex::new(false), Condvar::new()));
let pair2 = pair.clone();
// ...
thread::spawn(move|| {
let &(ref lock, ref cvar) = &*pair2;
// ...
}
Arc
的{{3}}是否返回对内部数据的引用?但是从&
中删除pair2
:
let &(ref lock, ref cvar) = *pair2;
给出了编译器错误:
11 | let &(ref lock, ref cvar) = *pair2;
| ^^^^^^^^^^^^^^^^^^^^^ expected tuple, found reference
|
= note: expected type `(std::sync::Mutex<bool>, std::sync::Condvar)`
found type `&_`
这似乎暗示*pair2
返回一个元组而不是引用。
答案 0 :(得分:0)
简短的答案是肯定的,Deref
返回一个引用,但是*
仍然取消了该引用。
在解密&*pair
之前,请先详细了解*pair
。
Arc
实现了Deref
特质,因此Rust编译器实质上进行了以下转换:
*pair
进入
*(pair.deref())
Arc::deref()
确实返回引用,但是*
将取消引用,从而产生一个元组。
Condvar
示例添加了前导&
,因为它只需要借用*pair
产生的元组。
另请参阅:
Deref::deref