Вы не указали полностью определенную проблему. В частности, что должно произойти, когда одна из строк не может быть обработана в цифре? Когда вы разбираете номер из строки с помощью parse
, он может выйти из строя. Поэтому функция возвращает Result
:
fn parse<F>(&self) -> Result<F, F::Err>
where F: FromStr
Вот решение, которое принимает вектор, получает итератор с iter
, изменяется каждый элемент с помощью map
и в конечном счете возвращает Result
с помощью collect
. Если синтаксический анализ был успешным, вы получите Ok
. Если любой не удалось, вы получаете Err
:
fn main() {
let input = "1,2,3";
let strings: Vec<_> = input.split(",").collect();
let numbers: Result<Vec<u16>, _> =
strings.iter().map(|x| x.parse()).collect();
println!("{:?}", numbers);
}
Или вы можете удалить неудачные преобразования путем преобразования Result
в Option
с ok
, а затем отфильтровывать None
значения с filter_map
:
fn main() {
let input = "1,2,3";
let strings: Vec<_> = input.split(",").collect();
let numbers: Vec<u16> =
strings.iter().filter_map(|x| x.parse().ok()).collect();
println!("{:?}", numbers);
}
Из Конечно, это бит глупо, чтобы преобразовать строку в вектор строк, а затем преобразовать ее снова в вектор целых чисел. Если вы на самом деле есть строка разделенных запятыми и хотите цифры, сделать это на одном дыхании:
fn main() {
let input = "1,2,3";
let numbers: Result<Vec<u16>, _> =
input.split(",").map(|x| x.parse()).collect();
println!("{:?}", numbers);
}
Решено! Спасибо за хорошее объяснение. – Axuttaja