Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 元组如何分解为引用?_Rust_Tuples_Destructuring - Fatal编程技术网

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
    都绑定为引用
另请参见以下关于堆栈溢出的文章: