Iterator / IntoIterator / FromIterator
trait Iterator
pub trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>;
実装している主要な型
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>();