# 迭代

``````#![allow(unused)]
fn main() {
// 对于 `Vec` 有效
let v = vec![1, 2, 3];
for n in &v {
println!("{}", n);
}

// 对于数组也有效
let a: [u32; 3] = [1, 2, 3];
for n in a.iter() {
println!("{}", n);
}
}``````

## `for` 循环的展开

``````#![allow(unused)]
fn main() {
let mut iter = v.into_iter();
loop {
match iter.next() {
Some(n) => {
println!("{}", n);
}
None => break,
}
}
}``````

`loop` 是除了 `for``while` 外的另一种循环结构。
`loop` 块会无限循环，除非你明确地使用 `break` 退出它。

## `Iterator` 特性

``````#![allow(unused)]
fn main() {
trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
}
}``````

`Item` 关联类型指定了由迭代器产生的值的类型。

`next` 返回序列中的下一个值。

## `IntoIterator` 特性

``````#![allow(unused)]
fn main() {
trait IntoIterator {
type Item;
type IntoIter: Iterator<Item = Self::Item>;
fn into_iter(self) -> Self::IntoIter;
}
}``````

`into_iter` 方法消耗原始值并返回其元素的迭代器。

## 边界检查

``````#![allow(unused)]
fn main() {
let v = vec![1, 2, 3];
for n in v {
println!("{}", n);
}
}``````

``````#![allow(unused)]
fn main() {
let v = vec![1, 2, 3];
for i in 0..v.len() {
println!("{}", v[i]);
}
}``````