2015-02-17 3 views
5

Перед обновления до более новой версии Rust следующего используются для работы:Что такое чистый способ преобразования результата в опцию?

let parsed_value: Vec<usize> = val.iter() 
            .filter_map(|e| e.parse::<usize>()) 
            .collect(); 

Однако теперь метод разбора возвращает Result типа вместо с Option.

Я мог бы создать Option через условное, но есть ли лучший/чистый способ?

ответ

8

Yup! Используйте Result::ok. Типы добавил для ясности:

let res: Result<u8,()> = Ok(42); 
let opt: Option<u8> = res.ok(); 
println!("{:?}", opt); 

Однако, если у вас есть итератор Result с, вы можете collect их в один большой Result. Это менее очевидно, но вы можете проверить разработчиков FromIterator для получения полного списка collect возможных элементов.

let strs = &["1", "2", "3", "4"]; 
let nums: Result<Vec<u8>, _> = strs.iter().map(|s| s.parse()).collect(); 
println!("{:?}", nums); 

Конечно, вы можете преобразовать один большой результат в опцию, как показывает первый пример.

Смежные вопросы