2016-05-17 46 views
0

我想知道我需要做什么来传递一个向量并返回一个字符串向量,以解决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

这是[交叉发布到Reddit](https://www.reddit.com/r/rust/comments/4jsvsz/exercismio_rust_problem/)。 – Shepmaster

回答

4

刚刚从

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同时接受v: Vec<T>v: [T; n]作为参数。

+0

就是这样。我一直在阅读文档,但无法弄清楚签名是否正确地处理了矢量&[&'a str]。谢谢我学到了关于访问ptr的一些信息。十分感谢!! – macshaggy

2

让我们看一个更行的编译器错误:

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的引用,所以接受片往往是最好的选择,当它适用。

+0

你做了什么是柯克我不能做的测试。我把第一部分展示了我的函数是如何被调用的。我必须使我的公共职能符合测试中的呼叫。 – macshaggy

+1

@macshaggy也许我的答案组织性很差,但最后一个答案(真实答案)只是对实现代码的更改,并不涉及对测试的任何更改。 – Shepmaster

相关问题