如何在 Rust 的特征中指定 "where" 注释?
How do I specify "where" annotations in a trait in Rust?
我正在尝试使用 print 语句重新实现 Vec::retain()
,以便弄清楚它是如何工作的,但我仍然停留在这个扩展类型注释 where F: FnMut(&T) -> bool
上。我明白它为什么在那里,但我不知道如何在特征声明中对其进行注释,以便它停止抛出错误(并让我修复代码中的其他错误):
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 });
}
错误:
- 原样:
error: the requirement `for<'r> F: std::ops::FnMut<(&'r T,)>` appears on the impl method but not on the corresponding trait method [E0276]
- 向特征添加
where
子句:error: type name `T` is undefined or not in scope [E0412]
如果我尝试指定 trait<T>
,编译器似乎也不喜欢它,而且我似乎无法在搜索结果中找到正确的内容。
如何指定?
您需要参数化特征:
trait TestVec<T> {
fn retain_with_prints<F>(&mut self, mut f: F)
where F: FnMut(&T) -> bool;
}
还有 link 实现时的类型。
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];
我正在尝试使用 print 语句重新实现 Vec::retain()
,以便弄清楚它是如何工作的,但我仍然停留在这个扩展类型注释 where F: FnMut(&T) -> bool
上。我明白它为什么在那里,但我不知道如何在特征声明中对其进行注释,以便它停止抛出错误(并让我修复代码中的其他错误):
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 });
}
错误:
- 原样:
error: the requirement `for<'r> F: std::ops::FnMut<(&'r T,)>` appears on the impl method but not on the corresponding trait method [E0276]
- 向特征添加
where
子句:error: type name `T` is undefined or not in scope [E0412]
如果我尝试指定 trait<T>
,编译器似乎也不喜欢它,而且我似乎无法在搜索结果中找到正确的内容。
如何指定?
您需要参数化特征:
trait TestVec<T> {
fn retain_with_prints<F>(&mut self, mut f: F)
where F: FnMut(&T) -> bool;
}
还有 link 实现时的类型。
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];