2016-07-12 8 views
1

Vec::retain()をprintステートメントで再実装しようとしていますが、どのように動作するのか把握できるようになっていますが、この拡張タイプの注釈where F: FnMut(&T) -> boolに固執しています。Rustの特性に「どこで」注釈を指定するにはどうすればいいですか?

trait TestVec { 
    fn retain_with_prints<F>(&mut self, mut f: F); 
} 

impl<T> TestVec for Vec<T> { 
    fn retain_with_prints<F>(&mut self, mut f: F) 
     where F: FnMut(&T) -> bool 
    { 
     let len = self.len(); 
     let mut del = 0; 
     { 
      let v = &mut **self; 

      for i in 0..len { 
       println!("on position: {}", &i); 
       if !f(&v[i]) { 
        del += 1; 
        println!("incremented del to: {}", del); 
       } else if del > 0 { 
        println!("swapping {} for {}", v[i - del], v[i]); 
        v.swap(i - del, i); 
       } 
      } 
     } 
     if del > 0 { 
      println!("removing last {} elements of vector", del); 
      self.truncate(len - del); 
     } 
    } 
} 

fn main() { 
    let v = vec![0,1,2,3,4,5]; 
    v.retain_with_prints(|item| { item % 2 == 0 }); 
} 

エラー:私はそれがありますが、私はそれがエラーを投げて停止しますので、トレイト宣言で、それに注釈を付ける方法を見つけ出すことはできません(と私は他のコード内のものを修正することができます)理由を理解

  • あるとして:形質にwhere句を追加するerror: the requirement `for<'r> F: std::ops::FnMut<(&'r T,)>` appears on the impl method but not on the corresponding trait method [E0276]
  • error: type name `T` is undefined or not in scope [E0412]

Iトン場合、コンパイラはそれを好きしていないようですまた、trait<T>を指定すると、検索結果に正しいものが表示されないようです。

どうすれば指定できますか?

trait TestVec<T> { 
    fn retain_with_prints<F>(&mut self, mut f: F) 
     where F: FnMut(&T) -> bool; 
} 

し、また、実装時に種類をリンク:

答えて

3

あなたが特性をパラメータ化する必要があります。その向こう

impl<T> TestVec<T> for Vec<T> 

、あなたはあなたのTはDisplayを実装することを必要とし、あなたの変数可変にする必要があります。

impl<T> TestVec<T> for Vec<T> 
    where T: std::fmt::Display 
{ 
let mut v = vec![0,1,2,3,4,5]; 
関連する問題