2017-09-05 11 views
1

ベクトルにマップする関数を書いた。メソッドの定義は、3つの汎用パラメータを期待し、入力ベクトルと機能の上に定義されています。予想される型パラメータ、見つかったと期待されるA

pub fn map<F, A, B>(mapFn: F, vect: &[A]) -> &[B] 
where 
    F: Fn(A) -> B, 
{ 
    let mut list = vec![]; 

    for v in vect { 
     let mut value = mapFn(v); 
     list.push(value); 
    } 

    &list[..] 
} 

私はこのエラーを取得する:

error[E0308]: mismatched types 
--> src/main.rs:8:31 
    | 
8 |   let mut value = mapFn(v); // <------ This is where I get the error 
    |        ^expected type parameter, found &A 
    | 
    = note: expected type `A` 
      found type `&A` 

は、私はまた、Generics Error: expected type parameter, found structをチェックし、ほぼ同じように見えるしませんでした問題。

+2

私はあなたの機能の関心を見ることができません。このメソッドは既に存在します。 – Boiethios

答えて

3

コードにはいくつか問題があります。

let mut list = vec![]; // allocate in a function 
// [cut] 
&list[..] // return a reference to memory allocated in the function 
      // ... which gets freed at the end of the function 
      // (if this compiled you'd have a dangling reference) 

修正がVec直接


を返し
:錆の所有権モデルは


メイン1(直接あなたのエラーの原因となっていないが)これです...厳しいが、公正です

2番目のもの(このエラーは直接エラーを解決します):スライス(vect)から要素を取り出して、新しいベクトル(list)を返し、新しいベクトルを返します。 vectのようなスライスはその要素を所有していないので、あなたが与えることができるのは参照ですが、listVecなので、その要素を所有したいと考えています。

修正オリジナル要素の所有するバージョンを持つために、あなたはどちらかに持っている:

  1. vectあなたはClone(あなたが新しいにそれらのコピーを保存することができ項目が含まれて持っていますベクター)。これにより、関数の汎用性が制限されます(すべての型がClone - 可能)。関数のシグネチャと呼び出しにバインドされたA: Cloneを追加することで実現できます。mapFn(v.clone())
  2. 関数に、入力パラメータをvect: Vec<A>にする完全な所有権を与えます。これの欠点は、vectからlistに要素を移動すると、vectは使用できなくなることです。

playground


より柔軟なアプローチであるさび標準ライブラリがmap on iteratorsを定義することに注意してください。入力を反復しながら要素ごとに関数を適用するので、要素を所有または複製する必要はありません。

1

まず、map adaptor for iteratorsがあります。

ここで問題となるのは、mapFnは所有されている値を期待していますが、スライス(& [A])を反復することで参照できます。

パラメータをVecにするか、fnMapを受け入れて& Aにすることで問題を解決できます。

最後に、refを返すことはここでは望んでいないので、単純なVecを返すことができます。

関連する問題