Rust 类型Fn未实现大小调整

Rust 类型Fn未实现大小调整,rust,Rust,我想构建一个函数,将一个列表拆分为两个:一个列表包含满足某个谓词的原始列表元素,另一个列表包含不满足该谓词的所有元素。以下是我的尝试: fn split_filter<T: Clone + Sized>(a: &Vec<T>, f: Fn(&T) -> bool) -> (Vec<T>, Vec<T>) { let i: Vec<T> = vec![]; let e: Vec<T>

我想构建一个函数,将一个列表拆分为两个:一个列表包含满足某个谓词的原始列表元素,另一个列表包含不满足该谓词的所有元素。以下是我的尝试:

fn split_filter<T: Clone + Sized>(a: &Vec<T>, f: Fn(&T) -> bool) -> (Vec<T>, Vec<T>) {
    let i: Vec<T> = vec![];
    let 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));
}
fn分割过滤器(a:&Vec,f:fn&T)->bool)->(Vec,Vec){
设i:Vec=Vec![];
设e:Vec=Vec![];
对于a.iter()中的u.cloned()){
如果f(&u){
i、 推(u)
}否则{
e、 推(u)
}
}
返回(即,e);
}
fn main(){
设v=vec![10,40,30,20,60,50];
println!(“{:?}”,split_filter(&v,|&a|a%3==0));
}
但是,我有两个错误:

error[E0277]:静态:std::marker::Sized'的特性绑定'for bool+'不满足
-->src/main.rs:1:47
|
1 | fn拆分过滤器(a:&Vec,f:fn(&T)->布尔)->(Vec,Vec){
|^`for bool+'static`在编译时没有已知的常量大小
|
=帮助:特性'std::marker::Sized'未为'for bool+'静态实现`
=注意:所有局部变量必须具有静态已知的大小
错误[E0308]:类型不匹配
-->src/main.rs:17:39
|
17 | println!(“{:?}”,split_filter(&v,|&a | a%3==0));
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^预期的特征std::ops::F
|
=注意:预期类型为'for bool+'静态`
找到类型`[closure@src/main.rs:17:39:17:54]`
第二个错误似乎暗示闭包不是
Fn
。我尝试使用我在网上某处找到的语法
f:|&T |->bool
,但在最新版本的Rust中似乎不起作用


至于第一个错误,我希望设置
T
的大小将使函数具有已知的大小,但显然没有。

你应该特别阅读官方的锈书。你的函数声明是不正确的;你指定
f
有一个裸露的特征类型,这是不可能的这正是关于
size
的错误所在。您应该改用泛型类型参数:

fn split_filter<T: Clone, F>(a: &[T], f: F) -> (Vec<T>, Vec<T>)
where
    F: for<'a> Fn(&'a T) -> bool,

请在上尝试。

对于未来的读者,此方法已在名称下为迭代器实现。
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));
}