Есть ли способ разыменования среза внутри, отображающего итератор на больший срез? - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь использовать 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 голосов
/ 09 апреля 2019

Я думаю, что это соответствует тому, что вы ищете.Я немного изменил ваш пример, разбив цепную операцию на несколько операторов, а также напечатав 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>`
...