はじめに
#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 日本語版