2016-05-17 19 views
0

exercism.ioでアナグラム演習を解決するために、ベクトルを渡して文字列のベクトルを返すために必要なことを理解しようとしています。ここで ベクトルを渡して文字列のベクトルを返すにはどうすればよいですか?

は、私が合格しようとしているテストです:

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: &[&'a str]) -> Vec<&'a str> 

&[T]

pub fn anagrams_for<'a>(word: &str, inp: Vec<&'a str>) -> Vec<&'a str> 

から、あなたの関数のシグネチャを変更するには、&vを使用して引数として両方v: Vec<T>v: [T; n]を受け入れることができます。

+0

それはそうだった。私はドキュメントを読んできましたが、そのシグネチャがベクトルに正しく到達するには&[& 'a str]であることがわかりませんでした。ありがとう、私はptrにアクセスすることについて何かを学んだ。本当にありがとう!! – macshaggy

2

のは、コンパイラエラーの1行を見てみましょう:

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の配列への参照)を渡しています。これらの2つのタイプは同じではありません!

あなたは、ベクター中に、配列を変換することができ、あなたのコードを動作させるには:

anagrams_for("diaper", inputs.to_vec()); 

それとも、で開始するベクターを構築することができます:

let inputs = vec!["hello", "world", "zombies", "pants"]; 
anagrams_for("diaper", inputs); 

しかし、それらの両方が原因愚かですあなたはベクトルを割り当てて、それがあなたに与える力のどれも使うことはありません。代わりに、あなたは本当にただの文字列スライスのスライスを受け入れるようにしたい:Vecへの参照ができるので、スライスを受け入れることは、多くの場合、最高であるよう

fn anagrams_for<'a>(word: &str, inp: &[&'a str]) -> Vec<&'a str> 

配列への参照が暗黙のうちに、スライスに変換することができますそれが適用されるとき、選択。

+0

あなたがしたことは、私ができないテストのカークでした。私は、私の関数がどのように呼び出されているかを示す最初の部分を入れました。テストの呼び出しに合わせるために私の公的な機能に合致しなければなりません。 – macshaggy

+1

@macshaggy多分私の答えは整理されていませんが、最後の答え(実際のもの)は実装コードの変更だけであり、テストの変更は一切ありません。 – Shepmaster

関連する問題