弧内的元组如何通过引用变形?

时间:2019-07-09 17:24:51

标签: rust tuples destructuring reference-counting

我正在看Condvar example,很好奇元组pairpair2的结构:

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返回一个元组而不是引用。

1 个答案:

答案 0 :(得分:0)

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

在解密&*pair之前,请先详细了解*pair

Arc实现了Deref特质,因此Rust编译器实质上进行了以下转换:

*pair

进入

*(pair.deref())

Arc::deref()确实返回引用,但是*将取消引用,从而产生一个元组。

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

另请参阅: