你应该阅读 Rust 官方书籍,尤其是关于闭包的章节 https://doc.rust-lang.org/stable/book/second-edition/ch13-01-closures.html。您的函数声明不正确;你指定的是f
有一个纯粹的特质类型,这是不可能的;这正是错误所在Sized
是关于。您应该改用泛型类型参数:
fn split_filter<T: Clone, F>(a: &[T], f: F) -> (Vec<T>, Vec<T>)
where
F: for<'a> Fn(&'a T) -> bool,
我也改变了类型a
from &Vec<T>
to &[T]
;在任何情况下,您都不会更喜欢前者而不是后者。&Vec<T>
自动强制&[T]
必要时。看
第二个错误与函数声明中的错误密切相关;你的原始函数声明指定了一个裸特征类型,但闭包没有这种类型,它们只是实现了函数特征。
最终程序如下所示:
fn split_filter<T: Clone, F>(a: &[T], f: F) -> (Vec<T>, Vec<T>)
where
F: Fn(&T) -> bool,
{
let mut i: Vec<T> = vec![];
let mut e: Vec<T> = vec![];
for u in a.iter().cloned() {
if f(&u) {
i.push(u);
} else {
e.push(u);
}
}
return (i, e);
}
fn main() {
let v = vec![10, 40, 30, 20, 60, 50];
println!("{:?}", split_filter(&v, |&a| a % 3 == 0));
}
尝试一下.