有没有办法在将迭代器映射到更大的切片上时取消切片的引用?

时间:2019-04-09 09:27:07

标签: string vector rust slice

我正在尝试使用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,但是以后再做。我遇到了一个我不知道如何解决的问题,这对我来说更重要的是如何将切片的片段转换为值,然后知道如何专门修复此行代码。

1 个答案:

答案 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>>();