gemini CLI に書いてもらったコード。
Ok(records_iter .filter_map(|res| match res { Ok(val) => Some(val), Err(e) => { warn!("Failed to read record: {:?}", e); None } }) .collect::<HashMap<_, _>>())
ダサいから書き直してよと言ったら、こうなった。これはカッコよい。
Ok(records_iter .flat_map(|res| res.inspect_err(|e| warn!("Failed to read record: {:?}", e))) .collect())
まず、 Result 型はイテレータを実装しており、 Ok なら 1 要素、 Err なら 0 要素を返す。よって、 flat_map で Ok だけを取り出せる。
#[inline] fn into_iter(self) -> IntoIter<T> { IntoIter { inner: self.ok() } }
内部で .ok() を呼んでいるので、これだけだと Err は捨てられてしまう。そこで、 .flat_map される直前に .inspect_err で中身を確認する。
素晴らしい。