我正在做Rust 示例教程,其中包含以下代码片段:
// Vec example let vec1 = vec![1, 2, 3]; let vec2 = vec![4, 5, 6]; // `iter()` for vecs yields `&i32`. Destructure to `i32`. println!("2 in vec1: {}", vec1.iter() .any(|&x| x == 2)); // `into_iter()` for vecs yields `i32`. No destructuring required. println!("2 in vec2: {}", vec2.into_iter().any(| x| x == 2)); // Array example let array1 = [1, 2, 3]; let array2 = [4, 5, 6]; // `iter()` for arrays yields `&i32`. println!("2 in array1: {}", array1.iter() .any(|&x| x == 2)); // `into_iter()` for arrays unusually yields `&i32`. println!("2 in array2: {}", array2.into_iter().any(|&x| x == 2));
我很困惑 - 对于 a Vec,从生成引用返回的迭代器和从生成值.iter返回的迭代器,但是对于数组,这些迭代器是相同的吗?.into_iter
Vec
.iter
.into_iter
这两种方法的用例/API 是什么?
iter()和方法into_iter()有不同的用途,具体取决于它们所调用的集合类型。
iter()
into_iter()
为了Vec<T>:
Vec<T>
iter():返回对向量 ( ) 元素的引用的迭代器&T。这允许您迭代向量而不消耗它。
&T
T
iter()当您想迭代向量的元素而不修改或使用它时使用。into_iter()当您想使用向量并迭代其元素时使用,可能会将所有权转移给迭代器。
对于数组 ( [T; N]):
[T; N]
iter()和都into_iter()返回对数组元素的引用的迭代器 ( &T)。
对于数组,由于它们具有固定大小,并且元素在内存中连续存储,因此两个迭代器之间没有区别。iter()和into_iter()都会生成迭代器,这些迭代器会产生对数组元素的引用。
因此,对于数组,您可以根据自己的喜好或方便使用iter()或,因为它们提供了通过引用迭代数组元素的相同功能。into_iter()
总之,对于涉及所有权语义的地方,iter()和之间的差异into_iter()更加明显Vec<T>,而对于数组,两种方法的行为相似,因为它们产生对数组元素的引用。