Rust 对迭代器中的引用不信任引用

Rust 对迭代器中的引用不信任引用,rust,Rust,我刚读完那本生锈的书。从前几章开始,我就有了下面的问题,希望能在书的后面解释一下,但那完全没有发生 为什么将&添加到for循环的模式匹配器会导致Rust尝试移动而不是仅仅匹配?有关示例,请参见下面的源代码 #[派生(调试)] 结构(i32); fn main(){ 设arr=[结构(1),结构(2)]; //手动遍历迭代器 设mut-iter=arr.iter(); 让我们首先:&Structure=iter.next().unwrap(); 让first_ref:&&Structure=&fi

我刚读完那本生锈的书。从前几章开始,我就有了下面的问题,希望能在书的后面解释一下,但那完全没有发生

为什么将
&
添加到
for
循环的模式匹配器会导致Rust尝试移动
而不是仅仅匹配?有关示例,请参见下面的源代码

#[派生(调试)]
结构(i32);
fn main(){
设arr=[结构(1),结构(2)];
//手动遍历迭代器
设mut-iter=arr.iter();
让我们首先:&Structure=iter.next().unwrap();
让first_ref:&&Structure=&first;//获取对引用的引用
println!(“{:?}”,first_ref);//按预期工作
对于arr.iter()中的elem{//这里elem是类型和结构
打印!(“{:?}”,elem);
}
println!(“”);
//以下代码不编译。
//用于阵列iter中的元素(&E)(){
//打印!(“{:?}”,elem);
// }
//println!(“”);
//这就是我得到的错误
//数据移到这里
//之所以发生移动,是因为'elem'的类型为'Structure',而该类型不实现'Copy'特性
}

模式匹配器通常以以下方式工作:在右手边,你传递一个你想撕开的对象,在左手边,你描述该对象的结构,在这个描述中,你还提到你自己的标识符,你想包含被撕开的对象的碎片:

let opt = Some("abc");
let Some(s) = opt;

// match `s` to the inner part of the `Option`, so `s` will contain "abc"
您的示例也不例外-这不是“参照提取”,而是描述如何将对象撕裂,因此:

for &elem in arr.iter() { 
     // `arr.iter().next()` yields `&Structure`
     // your description says - match `elem` to `Structure` part of `&Structure`
}

模式匹配器通常以以下方式工作:在右侧传递一个要拆分的对象,在左侧描述该对象的结构,在该描述中,您还提到了您自己的标识符,希望包含拆分对象的各个部分:

let opt = Some("abc");
let Some(s) = opt;

// match `s` to the inner part of the `Option`, so `s` will contain "abc"
您的示例也不例外-这不是“参照提取”,而是描述如何将对象撕裂,因此:

for &elem in arr.iter() { 
     // `arr.iter().next()` yields `&Structure`
     // your description says - match `elem` to `Structure` part of `&Structure`
}

所有防锈作业均由图案匹配完成。左侧被视为右侧与之匹配的图案。如果模式是
&elem
,并且您将其与类型为
&Structure
的项目相匹配,则
elem
将具有类型
Structure
(不完全是所有–仅绑定新名称的分配)。所有分配均按模式匹配。左侧被视为右侧与之匹配的图案。如果模式是
&elem
,并且您将其与类型为
&Structure
的项相匹配,则
elem
将具有类型
Structure
(并非全部–仅绑定新名称的赋值)。这是有意义的。但我没有告诉rust搬家,只想说“将
元素
匹配到
结构
部分
&结构
”。相应地更新了问题。@Shridharshan in Rust中的“一切都是移动的”,除非您另外声明,但在pattern matcher的情况下,您不能要求它“借用”某些东西,您只能说要匹配哪些碎片。因此,正确的(也许是唯一的)方法是在循环中获取引用,因为很少有需要双重引用的情况,这是有意义的。但我没有告诉rust搬家,只想说“将
元素
匹配到
结构
部分
&结构
”。相应地更新了问题。@Shridharshan in Rust中的“一切都是移动的”,除非您另外声明,但在pattern matcher的情况下,您不能要求它“借用”某些东西,您只能说要匹配哪些碎片。因此,正确的(也许是唯一的)方法是在循环中获取引用,因为很少有需要双重引用的情况