Я думаю, что это соответствует тому, что вы ищете.Я немного изменил ваш пример, разбив цепную операцию на несколько операторов, а также напечатав window
и произведение трех целых чисел в этом окне.
fn main() {
let a = "12345678910111213141516171819";
// create a vector of u32 from the str
// in "real" code you should handle the Result
// returned by `c.to_digit(10)` rather than
// just unwrapping
let nums = a
.chars()
.map(|c| c.to_digit(10).unwrap())
.collect::<Vec<u32>>();
// iterate over windows of size three
for window in nums.windows(3) {
// take the product of the current window
let product: u32 = window.iter().product();
println!("{:?}: {}", window, product);
}
}
И вывод:
$ cargo run
[1, 2, 3]: 6
[2, 3, 4]: 24
[3, 4, 5]: 60
[4, 5, 6]: 120
[5, 6, 7]: 210
[6, 7, 8]: 336
[7, 8, 9]: 504
[8, 9, 1]: 72
[9, 1, 0]: 0
[1, 0, 1]: 0
[0, 1, 1]: 0
[1, 1, 1]: 1
[1, 1, 2]: 2
[1, 2, 1]: 2
[2, 1, 3]: 6
[1, 3, 1]: 3
[3, 1, 4]: 12
[1, 4, 1]: 4
[4, 1, 5]: 20
[1, 5, 1]: 5
[5, 1, 6]: 30
[1, 6, 1]: 6
[6, 1, 7]: 42
[1, 7, 1]: 7
[7, 1, 8]: 56
[1, 8, 1]: 8
[8, 1, 9]: 72
Как отмечается в комментариях к вопросу, одна из проблем, с которыми вы здесь сталкиваетесь, заключается в том, что вы не работаете с теми типами, о которых думаете.Когда это происходит со мной, я обычно вводю преднамеренную ошибку типа, просто чтобы проверить сообщение об ошибке:
let nums: () = a
.chars()
.map(|c| c.to_digit(10).unwrap())
.collect::<Vec<u32>>();
, которое приводит к ошибке:
error[E0308]: mismatched types
--> src/main.rs:3:20
|
3 | let nums: () = a
| ____________________^
4 | | .chars()
5 | | .map(|c| c.to_digit(10).unwrap())
6 | | .collect::<Vec<u32>>();
| |______________________________^ expected (), found struct `std::vec::Vec`
|
= note: expected type `()`
found type `std::vec::Vec<u32>`