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;
}
し、また、実装時に種類をリンク: