在Rust中,iter()
, into_iter()
, iter_mut()
都是用于在集合类型上创建迭代器的方法。这三个方法各有不同,下面一一进行介绍。
-
iter()
:iter()
方法创建一个不可变的引用迭代器。当你只想读取集合中的元素,而不想改变它们或消耗集合时,应使用iter()
。iter()
返回的迭代器将生成集合中每个元素的不可变引用。rustlet v = vec![1, 2, 3]; for i in v.iter() { println!("{}", i); }
在上面的代码中,
i
的类型是&i32
,它是对元素的引用,我们不能修改这些元素。 -
into_iter()
:into_iter()
方法创建一个消耗集合的迭代器。into_iter()
会获取集合的所有权并返回集合中每个元素的所有权。在你想要转移集合中元素所有权时,应使用into_iter()
。rustlet v = vec![1, 2, 3]; for i in v.into_iter() { println!("{}", i); }
在这个例子中,
i
的类型是i32
。into_iter()
消耗了v
,这意味着v
在此后不能再被使用。 -
iter_mut()
:iter_mut()
创建一个可变引用迭代器。当你想要修改集合中的元素时,应使用iter_mut()
。iter_mut()
返回的迭代器将生成集合中每个元素的可变引用。rustlet mut v = vec![1, 2, 3]; for i in v.iter_mut() { *i += 1; }
在这个例子中,
i
的类型是&mut i32
,我们可以修改v
中的元素。
总结:iter()
返回不可变引用,into_iter()
获取元素的所有权并消耗集合,iter_mut()
返回可变引用。选择哪一个取决于你是否需要修改元素或是否需要元素的所有权。
into_iter() 方法
在Rust中,into_iter
是一个方法,其功能是将一个集合转换成一个迭代器。这个迭代器可以逐个访问集合中的元素,使我们能够遍历集合。
不同于 iter()
和 iter_mut()
,into_iter()
方法会消耗(take ownership of)原集合,这意味着集合在 into_iter()
调用之后将无法再次使用。这是因为 into_iter()
产生的迭代器每次迭代都会"移出"一个元素,直到集合为空。
以下是一个 into_iter()
的示例:
rust
let vec = vec![1, 2, 3];
let mut iter = vec.into_iter();
assert_eq!(Some(1), iter.next());
assert_eq!(Some(2), iter.next());
assert_eq!(Some(3), iter.next());
assert_eq!(None, iter.next());
在这个例子中,我们创建了一个包含三个元素的向量,并通过调用 into_iter()
将其转换为一个迭代器。然后,我们通过反复调用 next()
来逐个获取元素。当所有元素都被取出后,next()
返回 None
,表示没有更多的元素。
再次提醒,由于 into_iter()
会消耗原集合,所以在 into_iter()
调用之后,原向量 vec
就无法再次使用了。这就是所谓的"消耗性"迭代。
iter.next() 方法
在 Rust 中,iter.next()
是迭代器接口中的方法,用于获取序列中的下一个元素。next
方法的返回类型通常是 Option<T>
,其中 T
是你正在迭代的集合中元素的类型。
当还有可用元素时,next
方法会返回 Some(element)
,这里的 element
是序列中的下一个元素。当所有元素都已经被迭代完,next
方法会返回 None
,表示没有更多的元素可以迭代。
所以,iter.next()
返回 Some(1)
表示迭代器的下一个元素是 1
。当你看到 assert_eq!(Some(1), iter.next());
这样的代码时,它的意思是,我们期望迭代器的下一个元素是 1
。如果不是,那么这个断言就会失败,程序就会停止执行。
请注意,迭代器会在每次调用 next
方法时消耗一个元素。这意味着如果你再次调用 next
,你会得到序列中的下一个元素,或者如果没有更多元素,就会得到 None
。