Я выполняю шорох упражнений, чтобы выучить Rust. Я выполнил упражнение iterator3.rs и застрял. В этом упражнении меня попросили предоставить строку кода, которая будет отображать результаты одного типа в другой как часть операции; Мне нужно заполнить строку x = правильной операцией. Есть две части - первая читается частично:
let numbers = vec![27, 297, 38502, 81];
let division_results = numbers.into_iter().map(|n| divide(n, 27));
let x = ???
assert_eq!(format!("{:?}", x), "Ok([1, 11, 1426, 3])");
Следующее то же самое с немного другим форматом для подтверждения вывода:
assert_eq!(format!("{:?}", x), "[Ok(1), Ok(11), Ok(1426), Ok(3)]");
Мне кажется, я понимаю, что первый экземпляр должен возвращать Result, который содержит Vector of i32 или какой-либо тип ошибки. Второй должен возвращать вектор результатов, каждый из которых имеет тип i32 или тип ошибки.
Однако мне, как правило, трудно понять, как определить, какой тип возвращается комбинациями into_iter, map и collect. Я мог бы использовать некоторую помощь в обучении рассуждению об этом или в получении помощи компилятора.
Вот где я сейчас нахожусь:
Я не понимаю, что такое результирующий тип Division_results. Я пытался использовать сообщения об ошибках компилятора, а также ответ на этот вопрос , чтобы выяснить это, но результаты для меня непрозрачны, возможно, из-за ленивой оценки. Например, просто заменив x на Division_results, чтобы assert отобразил типы, например:
assert_eq!(format!("{:?}", division_results), "Ok([1, 11, 1426, 3])");
Дает мне этот результат:
left: `"Map { iter: IntoIter([27, 297, 38502, 81]) }"`,
right: `"Ok([1, 11, 1426, 3])"`', exercises/standard_library_types/iterator3.rs:75:9
И не ясно, каковы результаты левой стороны, так как итерации и карты не произошло. Другие разные вещи, которые я пробовал, дают похожие результаты.
Думая, что проблема в ленивой оценке, я также попытался использовать метод сбора, чтобы проверить, не вызовет ли это оценку. Например, вызов функции collect в конце строки Division_results выглядит следующим образом:
division_results = numbers.into_iter().map(|n| divide(n, 27)).collect();
Предоставляет ошибку:
cannot infer type consider giving `division_results` a type
Когда я изменяю коллекцию, чтобы сказать:
let division_results = numbers.into_iter().map(|n| divide(n, 27)).collect::<i32>();
Я получаю сообщение об ошибке, которое, как мне показалось, подсказало правильный тип:
let division_results = numbers.into_iter().map(|n| divide(n, 27)).collect::<i32>();
| ^^^^^^^ a collection of type `i32` cannot be built from `std::iter::Iterator<Item=std::result::Result<i32, DivisionError>>`
Итак, я попытался с типом, показанным в сообщении об ошибке:
let division_results = numbers.into_iter().map(|n| divide(n, 27)).collect::<Result<i32, DivisionError>>();
Только чтобы получить эту ошибку:
let division_results = numbers.into_iter().map(|n| divide(n, 27)).collect::<Result<i32, DivisionError>>();
| ^^^^^^^ a collection of type `i32` cannot be built from `std::iter::Iterator<Item=i32>`
Я явно что-то упускаю. Может быть, вы можете сказать мне, что?