小能豆

iter 和 into_iter 有什么区别?

rust

我正在做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

这两种方法的用例/API 是什么?


阅读 62

收藏
2024-05-21

共1个答案

小能豆

iter()和方法into_iter()有不同的用途,具体取决于它们所调用的集合类型。

  1. 为了Vec<T>

  2. iter():返回对向量 ( ) 元素的引用的迭代器&T。这允许您迭代向量而不消耗它。

  3. into_iter():使用向量并返回一个迭代器,该迭代器获取元素的所有权,并按值 ( T) 生成它们。这允许您在转移向量元素所有权的同时迭代该向量。

iter()当您想迭代向量的元素而不修改或使用它时使用。into_iter()当您想使用向量并迭代其元素时使用,可能会将所有权转移给迭代器。

  1. 对于数组 ( [T; N]):

  2. iter()和都into_iter()返回对数组元素的引用的迭代器 ( &T)。

对于数组,由于它们具有固定大小,并且元素在内存中连续存储,因此两个迭代器之间没有区别。iter()into_iter()都会生成迭代器,这些迭代器会产生对数组元素的引用。

因此,对于数组,您可以根据自己的喜好或方便使用iter()或,因为它们提供了通过引用迭代数组元素的相同功能。into_iter()

总之,对于涉及所有权语义的地方,iter()和之间的差异into_iter()更加明显Vec<T>,而对于数组,两种方法的行为相似,因为它们产生对数组元素的引用。

2024-05-21