PNGの規格を勉強する機会があったので、その内容を簡単に説明します*1。
PNGはいくつかの"チャンク"が集まって構成されています。例えば、IHDR
チャンクやIDAT
チャンク、PLTE
チャンクなどがあります。では、PNGファイルという単なるバイト列から、どのようにチャンクを抽出すれば良いのでしょうか?
これは、PNGファイルの構造を知ることでわかります。
続きを読むVectorをIteratorに変換する時にいつも混乱していたので整理した。
あるVectorの要素すべてを3倍するコードを考える。
fn main() { let vec1 = vec![1,2,3,4,5]; let vec2 = vec1.iter() .map(|i| i * 3) .collect::<Vec<i32>>(); println!("{:?}", vec1); println!("{:?}", vec2); }
このコードはコンパイルできるが、以下のような疑問がある。
vec1
はなぜ使えるのか? 3行目の vec1.iter()
で使われているじゃないか!map(|i| i * 3)
の i
は参照なのか値なのか?これらの疑問に関する答えは、
iter()
はVectorをmoveしない。into_iter()
はVectorをmoveする。iter()
はVectorから「参照のコレクションであるIterator」を作成し、into_iter()
はVectorから「値のコレクションであるIterator」を作成する。ということになる。
続きを読む