Iterator / IntoIterator / FromIterator

trait Iterator

pub trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>;

実装している主要な型

  • std::slice::Iter<'a, T>
  • Iterator派生型
    • Map
    • Filter
    • String.bytes

std::slice::Iter<'a, T>

impl<'a, T> Iterator for Iter<'a, T>
    type Item = &'a T
    pub fn next(&mut self) -> Option<&'a T>

trait IntoIterator

実装している型 (全て std::slice::Iter<'a, T>型 を生成している)

  • 配列
    • &[T; N]
    • &mut [T; N]
  • Vec<T>

&'a [T; N]

impl<'a, T, const N: usize> IntoIterator for &'a [T; N]
    type Item = &'a T
    type IntoIter = Iter<'a, T>
    pub fn into_iter(self) -> Iter<'a, T>

Vec<T>

要素の所有権が失われる

impl<T> IntoIterator for Vec<T>
    type Item = T
    type IntoIter = IntoIter<T>
    pub fn into_iter(self) -> IntoIter<T>

`&Vec

impl<'a, T> IntoIterator for &'a Vec<T>
    tpye Item = &'a T
    type IntoIter = Iter<'a, T>
    pub fn into_iter(self) -> Iter<'a, T>

FromIterator<A>

collect()で変換できるCollectionはFromIterator<Self::Item>トレイトが実装されている必要がある。

反対のトレイトとして、IntoIteratorがある。

Vec<_> への変換

impl<T> FromIterator<T> for Vec<T>
let five_fives = std::iter::repeat(5).take(5);
let v: Vec<i32> = five_fives.collect();

charsからStringの生成

impl FromIterator<char> for String
let chars = ['h', 'e', 'l', 'l', 'o'];
let text = chars.iter().collect::<String>();