IntoIterator
The Iterator
trait tells you how to iterate once you have created an iterator. The related trait IntoIterator
defines how to create an iterator for a type. It is used automatically by the for
loop.
struct Grid { x_coords: Vec<u32>, y_coords: Vec<u32>, } impl IntoIterator for Grid { type Item = (u32, u32); type IntoIter = GridIter; fn into_iter(self) -> GridIter { GridIter { grid: self, i: 0, j: 0 } } } struct GridIter { grid: Grid, i: usize, j: usize, } impl Iterator for GridIter { type Item = (u32, u32); fn next(&mut self) -> Option<(u32, u32)> { if self.i >= self.grid.x_coords.len() { self.i = 0; self.j += 1; if self.j >= self.grid.y_coords.len() { return None; } } let res = Some((self.grid.x_coords[self.i], self.grid.y_coords[self.j])); self.i += 1; res } } fn main() { let grid = Grid { x_coords: vec![3, 5, 7, 9], y_coords: vec![10, 20, 30, 40] }; for (x, y) in grid { println!("point = {x}, {y}"); } }
Click through to the docs for IntoIterator
. Every implementation of IntoIterator
must declare two types:
Item
: the type to iterate over, such asi8
,IntoIter
:into_iter
๋ฉ์๋์์ ๋ฐํ๋๋Iterator
ํ์ .
IntoIter
์๋ Item
์ด ์ฐ๊ฒฐ๋์ด ์์์ ์ฃผ๋ชฉํ์ธ์. IntoIter
๋ฐ๋ณต์๋ Item
ํ์
์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌ์ผ์ผ ํฉ๋๋ค. ์ฆ, ๋ฐ๋ณต์๋ Option<Item>
์ ๋ฆฌํดํฉ๋๋ค
์ด ์๋ x ๋ฐ y ์ขํ์ ๋ชจ๋ ์กฐํฉ์ ์ํํฉ๋๋ค.
main
์์ ๊ทธ๋ฆฌ๋๋ฅผ ๋ ๋ฒ ๋ฐ๋ณตํด ๋ณด์ธ์. ์ ์คํจํ๋์? IntoIterator::into_iter
๋ โselfโ์ ์์ ๊ถ์ ๊ฐ์ ธ์ต๋๋ค.
&Grid
์ IntoIterator
๋ฅผ ๊ตฌํํ๊ณ GridIter
์ Grid
์ฐธ์กฐ๋ฅผ ์ ์ฅํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ธ์.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์
์์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. for e in some_vector
๋ some_vector
์ ์์ ๊ถ์ ๊ฐ์ ธ์ ํด๋น ๋ฒกํฐ์์ ์์ ํ ์์๋ฅผ ๋ฐ๋ณตํฉ๋๋ค. some_vector
์ ์์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ฐ๋ณตํ๋ ค๋ฉด ๋์ for e in &some_vector
๋ฅผ ์ฌ์ฉํ์ธ์.