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

Note:

Vec<T>や配列[T]はIteratorではない。 これらがfor文で使えるのは、暗黙的にIntoIteratorのメソッドが呼ばれるため。

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

  • 配列 [T]
  • Vec<T>

配列

[T; N]

要素がCopyトレイト関わらず、所有権を失う。

impl<T, const N: usize> IntoIterator for [T; N]
     type Item = T

type IntoIter = IntoIter<T, N>

pub fn into_iter(self) -> <[T; N] as IntoIterator>::IntoIter

&'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>

要素がCopyトレイトか関わらず所有権を失う

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

`&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>();