我有一个生成字谜的函数,我想测试它,所以我有以下内容:
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)
(游乐场)
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)