Rust 入門 簡単な関数を書いてみる(3)

Rust 入門つづき。

引き続き住所を正規化する関数を書きながらRustの学習を進めているのだが、なんだかまだ理解できない状況にぶつかった。

正規表現でマッチした箇所を逆順に処理したく、試行錯誤の結果とりあえず次のような記述でいけそうなトコまでは辿り着いた。

let v: Vec<&str> = re.find_iter(s).map(|m| m.as_str()).collect();
for piece in v.iter().rev() {
    // 何かしたい処理
}

しかし、こう書くと「cannot infer type for B」というコンパイルエラーになる。

for piece in re.find_iter(s).map(|m| m.as_str()).collect().iter().rev() {
  // 何かしたい処理
}

これは、

let v: = re.find_iter(s).map(|m| m.as_str()).collect();

こう書くと、結果の型推論が利かずコンパイルエラーになるのと同じ原因だと思うのだが、何故そうなるのかがまだ理解できていない。

Rust なかなか手ごわい。


追記

collect() は型ヒントで型を明示しないといけないというのを完全に忘れていた。 という訳で型を指定することで1行で書けるようになった。

for piece in re.find_iter(s).map(|m| m.as_str()).collect::<Vec<&str>>().iter().rev() {
  // 何かしたい処理
}

前に書いた、都道府県を抜き出す処理ではキチンと collect() を呼ぶときに型指定してんのに、何で忘れるかなぁ。