如何编写内部数组长度不同的嵌套数组?

3 arrays rust

我有一个生成字谜的函数,我想测试它,所以我有以下内容:

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);
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何以可编译的方式编写此代码:

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]`
Run Code Online (Sandbox Code Playgroud)

游乐场

Joh*_*ica 5

group_anagrams返回一个Vec<Vec<String>>. 一种修复方法是使用answer嵌套Vec而不是嵌套数组进行匹配。

let answer = vec![
    vec!["ate", "eat", "tea"],
    vec!["nat", "tan"],
    vec!["bat"],
];
Run Code Online (Sandbox Code Playgroud)

如果您不想要嵌套Vec,您可以尝试使用切片,因为切片还会将编译时长度从类型移出并移至运行时存储中。

let answer = [
    &["ate", "eat", "tea"][..],
    &["nat", "tan"][..],
    &["bat"][..],
];
Run Code Online (Sandbox Code Playgroud)

当然,这看起来丑陋得多。而且它仍然无法编译程序的其余部分。(我将把它作为练习留给读者。)


原始代码无法编译,因为内部数组具有不同的长度,因此具有不同的类型:分别为[&str; 3][&str; 2][&str; 1]。这是三种不同的类型,数组不能包含异构项。

如果内部数组恰好具有相同的长度,则原始代码将编译。如果每个数组都有三个单词,那么整体类型将是[[&str; 3]; 3]

let answer: [[&str; 3]; 3] = [
    ["ate", "eat", "tea"],
    ["nat", "tan", "x"],
    ["bat", "y", "z"],
];
Run Code Online (Sandbox Code Playgroud)