Rust 元组如何分解为引用?
我正在查看,很好奇元组Rust 元组如何分解为引用?,rust,tuples,destructuring,Rust,Tuples,Destructuring,我正在查看,很好奇元组对和对是如何被分解的: let pair=Arc::new((Mutex::new(false),Condvar::new()); 让pair2=pair.clone(); // ... 线程::生成(移动| |{ let&(ref lock,ref cvar)=&*pair2; // ... } 从pair2中删除&: let&(ref-lock,ref-cvar)=*pair2; 如我所料,给出了一个编译器错误: 11 | let&(ref lock,ref cva
对
和对
是如何被分解的:
let pair=Arc::new((Mutex::new(false),Condvar::new());
让pair2=pair.clone();
// ...
线程::生成(移动| |{
let&(ref lock,ref cvar)=&*pair2;
// ...
}
从pair2
中删除&
:
let&(ref-lock,ref-cvar)=*pair2;
如我所料,给出了一个编译器错误:
11 | let&(ref lock,ref cvar)=*pair2;
|^^^^^^^^^^^^^^^^^^^^^^^^^^^所需的元组,已找到引用
|
=注意:应为类型“”(std::sync::Mutex,std::sync::Condvar)`
找到类型`&_`
但是,如果元组周围的&
被删除,它似乎可以正常编译和运行:
let(ref-lock,ref-cvar)=&*pair2;
或者如果同时删除了和:
let(ref-lock,ref-cvar)=*pair2;
甚至
let(lock,cvar)=&*pair2;
编译器是否在后一种情况下帮助了我们?编译器正在帮助我们使用。Match工效学适用于元组分解和Match
表达式;我们首先来看Match
表达式的情况
匹配人体工程学简化了参考模式与非参考模式匹配时Rust绑定变量的方式:
设x=Some(42);
设x_ref=&x;
匹配x_ref{/{},//{},
}
旧版本的Rust编译器不允许这样做。相反,必须在模式中指定引用(&
):
//旧锈
匹配x_ref{
&一些(a)=>{},
&无=>{},
}
或在匹配前取消引用:
//旧锈
匹配*x_参考{
一些(a)=>{},
无=>{},
}
请注意,a
拥有选项的内部值,这对于非Copy
类型是有问题的。为了避免这种情况,还必须借用内部值。这是通过使用ref
关键字将a
绑定为引用来完成的:
//旧锈
设x=Some(Box::new(42));
设x_ref=&x;
匹配x_ref{
&一些(参考a)=>{},
&无=>{},
}
或
//旧锈
匹配*x_参考{
一些(参考a)=>{},
无=>{},
}
Rust的新match人体工程学允许简化版本:
//新锈
匹配x_ref{
一些(a)=>{
//x_ref将自动取消引用
//将自动绑定为引用
},
无=>{},
}
对于复制
和非复制
类型
将此应用于元组分解
let pair=Arc::new((Mutex::new(false),Condvar::new());
let(lock,cvar)=&*对;
//^^^^^引用匹配表达式
//^^^^^^^^^^^^^^非参考模式
*pair
是一个元组
&*pair
是对元组的引用
lock
和cvar
都绑定为引用
另请参见以下关于堆栈溢出的文章: