Rust中的iter(), into_iter(), iter_mut()

rincloud發表於2024-05-27

在Rust中,iter(), into_iter(), iter_mut()都是用於在集合型別上建立迭代器的方法。這三個方法各有不同,下面一一進行介紹。

iter(): iter() 方法建立一個不可變的引用迭代器。當你只想讀取集合中的元素,而不想改變它們或消耗集合時,應使用 iter()。iter() 返回的迭代器將生成集合中每個元素的不可變引用。

let v = vec![1, 2, 3];
for i in v.iter() {
println!("{}", i);
}
在上面的程式碼中,i 的型別是 &i32,它是對元素的引用,我們不能修改這些元素。

into_iter(): into_iter() 方法建立一個消耗集合的迭代器。into_iter() 會獲取集合的所有權並返回集合中每個元素的所有權。在你想要轉移集合中元素所有權時,應使用 into_iter()。

let 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() 返回的迭代器將生成集合中每個元素的可變引用。

let 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() 的示例:

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。
————————————————

版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。

原文連結:https://blog.csdn.net/weixin_43844521/article/details/131886219

相關文章