我是这个语言的新手,目前正在阅读Rust in action.我明白为什么你能在for
圈之后访问向量.然而,我不明白为什么这是可行的:
let list = [1, 2, 3, 4, 5];
for item in list {
println!("{}", item);
}
println!("{:#?}", list);
如果我对一个向量做同样的try ,如果它不是for
内的引用,它是不起作用的,这是我理解的原因.
我是这个语言的新手,目前正在阅读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
.对于not和Copy
的类型,这需要for
循环的目标是moved来构造迭代器.但对于Copy
的类型,Rust makes a copy of the array,然后在into_iter
中使用该副本.
正如相关文件(链接如上)所述:
[.]创建一个使用迭代器,即每个值输出moves个迭代器 数组的(从头到尾).该数组不能在以下时间后使用 将其称为unless T implements 100,所以整个数组是copied.
emphasis mine个
未被发送