我是这个语言的新手,目前正在阅读Rust in action.我明白为什么你能在for圈之后访问向量.然而,我不明白为什么这是可行的:

let list = [1, 2, 3, 4, 5];
for item in list {
    println!("{}", item);
}
println!("{:#?}", list);

如果我对一个向量做同样的try ,如果它不是for内的引用,它是不起作用的,这是我理解的原因.

推荐答案

数字数组永远不会移动.如果数组的底层类型为Copy,则数组为Copy,这意味着,与基本数值类型一样,数组始终为copied,而不是移动.它们有资格享受这种特殊处理,因为数组只是表示其元素的字节的连续块,所以如果它的元素可以逐个字节复制,那么整个数组也可以复制.另一方面,向量涉及动态分配和指针,因此盲目复制向量的字节是不安全的.

当您使用for循环时,您将在类型上调用into_iter,它按值接受self.对于notCopy的类型,这需要for循环的目标是moved来构造迭代器.但对于Copy的类型,Rust makes a copy of the array,然后在into_iter中使用该副本.

正如相关文件(链接如上)所述:

[.]创建一个使用迭代器,即每个值输出moves个迭代器 数组的(从头到尾).该数组不能在以下时间后使用 将其称为unless T implements 100,所以整个数组是copied.

emphasis mine

Rust相关问答推荐

为什么父作用域中的变量超出了子作用域

把Vector3变成Vector4的绝妙方法

何时可以在Rust中退出异步操作?

在Rust中有没有办法在没有UB的情况下在指针和U64之间进行转换?

当T不执行Copy时,如何返回Arc Mutex T后面的值?

重写Rust中的方法以使用`&;mut self`而不是`mut self`

由于生存期原因,返回引用的闭包未编译

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

为什么我必须使用 PhantomData?在这种情况下它在做什么?

std mpsc 发送者通道在闭包中使用时关闭

为什么我们有两种方法来包含 serde_derive?

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

从 Axum IntoResponse 获取请求标头

类型判断模式匹配panic

Rust 异步和 AsRef 未被发送

在 Rust 中如何将值推送到枚举 struct 内的 vec?

Rust 中函数的类型同义词

在空表达式语句中移动的值

类型组的通用枚举

如果我立即等待,为什么 `tokio::spawn` 需要一个 `'static` 生命周期?