Как написать вложенный массив, где внутренние массивы имеют разную длину? - PullRequest
3 голосов
/ 07 апреля 2020

У меня есть функция, которая генерирует анаграммы, и я хочу проверить ее, поэтому у меня есть следующее:

pub fn group_anagrams(strs: Vec<String>) -> Vec<Vec<String>> {
    unimplemented!()
}

fn main() {
    let words = [
        "eat".to_string(),
        "tea".to_string(),
        "tan".to_string(),
        "ate".to_string(),
        "nat".to_string(),
        "bat".to_string(),
    ]
    .to_vec();
    let answer = [["ate", "eat", "tea"], ["nat", "tan"], ["bat"]];
    let solution = group_anagrams(words);
    assert_eq!(answer, solution);
}

Я не могу понять, как написать это способом, который будет компилироваться:

error[E0308]: mismatched types
  --> src/main.rs:15:42
   |
15 |     let answer = [["ate", "eat", "tea"], ["nat", "tan"], ["bat"]];
   |                                          ^^^^^^^^^^^^^^ expected an array with a fixed size of 3 elements, found one with 2 elements
   |
   = note: expected type `[&str; 3]`
             found array `[&str; 2]`

( Детская площадка )

1 Ответ

5 голосов
/ 07 апреля 2020

group_anagrams возвращает Vec<Vec<String>>. Одним из исправлений является сопоставление answer вложенных Vec s вместо вложенных массивов.

let answer = vec![
    vec!["ate", "eat", "tea"],
    vec!["nat", "tan"],
    vec!["bat"],
];

Если вы не хотите использовать вложенные Vec s, вы можете попробовать вместо этого использовать слайсы, так как слайсы также переместите длины времени компиляции из типов в хранилище времени выполнения.

let answer = [
    &["ate", "eat", "tea"][..],
    &["nat", "tan"][..],
    &["bat"][..],
];

Конечно, это выглядит намного ужаснее. И это все еще не заставляет остальную часть программы компилироваться. (Я оставлю это как упражнение для читателя.)


Исходный код не может скомпилироваться, потому что внутренние массивы имеют разную длину и, следовательно, разные типы: [&str; 3], [&str; 2], и [&str; 1] соответственно. Это три разных типа, и массивы не могут содержать гетерогенные элементы.

Исходный код будет компилироваться, если окажется, что внутренние массивы имеют одинаковую длину. Если бы у каждого массива было три слова, тогда общий тип был бы [[&str; 3]; 3]:

let answer: [[&str; 3]; 3] = [
    ["ate", "eat", "tea"],
    ["nat", "tan", "x"],
    ["bat", "y", "z"],
];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...