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}");
    }
}
This slide should take about 5 minutes.

Click through to the docs for IntoIterator. Every implementation of IntoIterator must declare two types:

  • Item: the type to iterate over, such as i8,
  • 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๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.