我正在尝试使用windows()
遍历切片Vec
的切片(windows
仅适用于切片),但是我需要使用char
切片(&[char]
)并使用常规char
。问题在于,由于char
切片指向Vec
切片,因此取消引用不起作用。我该如何解决?
let a = "12345678910111213141516171819";
let vec1: &str = &a;
println!(
"{:?}",
vec1.chars()
.collect::<Vec<char>>()
.windows(3)
.map(|b| b.to_digit(10).product())
);
给我错误
error[E0599]: no method named `to_digit` found for type `&[char]` in the current scope
--> src/main.rs:9:24
|
9 | .map(|b| b.to_digit(10).product())
| ^^^^^^^^
error: aborting due to previous error
我正在尝试将b
转换为常规字符,以便to_digit
可以使用它,然后使用product
查找整个Windows产品。我还没有尝试过product
,但是以后再做。我遇到了一个我不知道如何解决的问题,这对我来说更重要的是如何将切片的片段转换为值,然后知道如何专门修复此行代码。
答案 0 :(得分:0)
我认为这与您要查找的内容一致。我已通过将链接的操作拆分为多个语句并在该窗口中同时打印scrollPositionRestoration
和三个整数的乘积来对您的示例进行了一些修改。
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>>();