我正在试图弄清楚我需要做些什么才能传递一个向量并返回一个字符串向量,以解决exercism.io上的anagram练习。
这是我试图通过的测试:
fn test_no_matches() {
let inputs = ["hello", "world", "zombies", "pants"];
let outputs: Vec<&str> = vec![];
assert_eq!(anagram::anagrams_for("diaper", &inputs), outputs);
}
这是我到目前为止所写的内容:
pub fn anagrams_for<'a>(word: &str, inp: Vec<&'a str>) -> Vec<&'a str> {
let mut out: Vec<&str> = vec![];
let ref poss = *inp[1];
out.push(poss);
out
}
但是测试是在&inputs
上轰炸我的错误:
tests/anagram.rs:7:48: 7:55 error: mismatched types:
expected `collections::vec::Vec<&str>`,
found `&[&str; 4]`
(expected struct `collections::vec::Vec`,
found &-ptr) [E0308]
tests/anagram.rs:7 assert_eq!(anagram::anagrams_for("diaper", &inputs), outputs);
我读过关于引用,借用和生命周期的文章。老实说,我对传递引用有点困惑。我认为返回向量只是Vec<String>
,但我认为输入向量引用导致问题的str有一个问题。
如果有人能够推动我朝着更好的方向前进,那我将不会感谢柯克的考验。
答案 0 :(得分:5)
只需从
更改功能签名即可pub fn anagrams_for<'a>(word: &str, inp: Vec<&'a str>) -> Vec<&'a str>
到
pub fn anagrams_for<'a>(word: &str, inp: &[&'a str]) -> Vec<&'a str>
&[T]
可以使用v: Vec<T>
接受v: [T; n]
和&v
作为参数。
答案 1 :(得分:3)
让我们看一下编译器错误的另一行:
error: mismatched types:
expected `collections::vec::Vec<&str>`,
found `&[&str; 4]`
(expected struct `collections::vec::Vec`,
found &-ptr) [E0308]
assert_eq!(anagrams_for("diaper", &inputs), outputs);
^~~~~~~
查看编译器如何指出错误发生的位置?错误消息指出您应该传递Vec<&str>
(字符串切片的向量),而是传递&[&str; 4]
(对包含字符串切片的长度为4的数组的引用)。这两种类型不一样!
要使代码正常工作,可以将数组转换为向量:
anagrams_for("diaper", inputs.to_vec());
或者您可以构建一个以:
开头的向量let inputs = vec!["hello", "world", "zombies", "pants"];
anagrams_for("diaper", inputs);
但这两个都很愚蠢,因为你正在分配一个向量而从不使用它给你的任何力量。相反,你真的只想接受一片字符串切片:
fn anagrams_for<'a>(word: &str, inp: &[&'a str]) -> Vec<&'a str>
对数组的引用可以隐式转换为切片,对Vec
的引用也是如此,因此在应用时,接受切片通常是最佳选择。