より新しいRustバージョンに更新する前は、以下が機能していました。
fn example(val: &[&str]) {
let parsed_value: Vec<usize> = val
.iter()
.filter_map(|e| e.parse::<usize>())
.collect();
}
ただし、解析メソッドがのResult
代わりに型を返すようOption
になり、エラーが発生します。
error[E0308]: mismatched types
--> src/lib.rs:4:25
|
4 | .filter_map(|e| e.parse::<usize>())
| ^^^^^^^^^^^^^^^^^^ expected enum `std::option::Option`, found enum `std::result::Result`
|
= note: expected type `std::option::Option<_>`
found type `std::result::Result<usize, std::num::ParseIntError>`
Option
条件付きでスルーを作成することはできますが、より良い/よりクリーンな方法はありますか?
を使用しResult::ok
ます。明確にするために追加されたタイプ:
let res: Result<u8, ()> = Ok(42);
let opt: Option<u8> = res.ok();
println!("{:?}", opt);
対称性のために、またそこだOption::ok_or
とOption::ok_or_else
から行くことOption
にResult
。
あなたの場合、イテレータがあります。
失敗を無視したい場合は、を使用してくださいIterator::flat_map
。Result
(およびOption
)を実装するのでIntoIterator
、これは機能します:
let parsed_value: Vec<usize> = val
.iter()
.flat_map(|e| e.parse())
.collect();
最初の失敗で停止したい場合はcollect
、1つの大きなものにすることができますResult
。これはそれほど明白ではありませんがFromIterator
、collect
-ableアイテムの完全なリストについてはの実装者をチェックしてください。
let parsed_value: Result<Vec<usize>, _> = val
.iter()
.map(|e| e.parse())
.collect();
もちろん、最初の例が示すように、大きなものResult
をに変換することもできOption
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加