目次

Rustの勉強[イテレータその 2]

(更新: )ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる

  • 今日も要点を光らせたい

お勉強

#

NO IMAGE一連の要素をイテレータで処理する - The Rust Programming Language 日本語版
ここから

メモ

#
  • 他のイテレータを生成するメソッドの章
  • 確か前回は消費する話をした
let v1: Vec<i32> = vec![1, 2, 3];

let v2: Vec<_> = v1.iter().map(|x| x + 1).collect();

assert_eq!(v2, vec![2, 3, 4]);

イテレータアダプタは怠惰で、ここでイテレータを消費する必要があるのです。

  • .mapだとVec<i32>が作れないって話しだった
  • じゃあ.mapって何やってんだ?
  • collect()が消費するのはわかった
  • 理解した
    • v1.iter().map(|x| x + 1).collect();
    • mapの()内にクロージャ処理するのね
    • んでイテレータが返却される
    • vecにするにはcollectで消費して変換する必要がある

環境をキャプチャするクロージャを使用する

  • ここのキャプチャって考えたが、moveすることなんだろうか
  • キャプチャするってなんだよ
    • なるほど、クロージャ内部で使えるようにすることをキャプチャっていうのか
      • そこに参照とmoveがあると
  • そもそもIterator traitはtraitだから当たり前に実装できるよな
    • vecがtraitを実装してるだけ
    • と思ったが.iter()を使っていた

NO IMAGEIter in std::slice - RustImmutable slice iterator

  • iterはIter structを返しているらしい
  • へぇ

NO IMAGEiter.rs - sourceSource of the Rust file library/core/src/slice/iter.rs.

  • next関数意味わからんw
impl Iterator for Counter {
    type Item = u32;

    fn next(&mut self) -> Option<Self::Item> {
        self.count += 1;

        if self.count < 6 {
            Some(self.count)
        } else {
            None
        }
    }
}
  • そうか、このnext関数は+1するから5になるまでは消費できるんだ

まとめ

#
  • まあなんとなくわかった
  • next関数の実装の仕方によって挙動が変わるというのもわかった
  • 各々にクロージャを適応できるのも理解した

次はここ
NO IMAGE入出力プロジェクトを改善する - The Rust Programming Language 日本語版