Rust語言之GoF設計模式:迭代器模式

banq 發表於 2022-09-26
設計模式 Go

迭代器是一種行為設計模式,它允許順序遍歷複雜的資料結構而不暴露其內部細節。

標準迭代器
迭代器在Rust慣用語中被大量使用:

let array = &[1, 2, 3];
let iterator = array.iter();

// Traversal over each element of the vector.
iterator.for_each(|e| print!("{}, ", e));


自定義迭代器
在 Rust 中,定義自定義迭代器的推薦方法是使用標準std::iter 的Iterator trait

impl Iterator for UserIterator<'_> {
    fn next(&mut self) -> Option<Self::Item>;
}



let users = UserCollection::new();
let mut iterator = users.iter();

iterator.next();


上述程式碼方法next是唯一Iterator必須實現的trait方法。它可以訪問大量的標準方法,例如fold、map、for_each。

Rust 迭代器是惰性的,這意味著它們在被告知之前不會執行。這意味著您可以在迭代器上新增任何一系列操作,並且在您使用它之前它永遠不會“執行”。

如果將職責鏈 責任鏈 中的過濾器組合成一個集合,那麼對這個集合需要迭代應用啟用一個個過濾器,Rust這種懶惰是有優勢的,只有在執行時才會啟用,而不會耗費大量預處理過程。
如果將命令模式中一個個命令組合成一個大集合,那麼也需要迭代器。