是否可以将对象方法作为参数传递给函数并将其绑定到对象?

Vic*_*voy 7 rust

是否可以绑定到对象方法?例如,如果向量中存在某个项目,我有一个向量和许多函数可以执行某些操作.我会按如下方式实现它:

fn perform_if_exists(item: u8, vector: &Vec<u8>, func: fn(usize)) {
    let idx = vector.iter().position(|i| *i == item );
    match idx {
        Some(i) => func(i), 
        None    => {},
    }
}

fn main() {
    let v: Vec<u8> = vec![1, 2, 3];
    perform_if_exists(1, &v, Vec<_>::remove);
}
Run Code Online (Sandbox Code Playgroud)

但它会带来很多错误.我认为它们是合理的,但这是因为我不明白如何将vector的方法作为参数添加到函数中.

She*_*ter 5

可能吗

当然是啦.您必须首先修复多个级联错误:

  1. 语法无效:Vec<_>::remove无效.
  2. 不兼容的参数类型:Vec::remove修改aVec,所以你必须以Vec某种方式传递.
  3. 可变性:Vec::remove 修改 a Vec,所以你必须声明允许该函数这样做.
  4. Vec::remove 返回已删除的值,因此您必须允许该函数返回一个值,即使它已被丢弃.
fn perform_if_exists<F, R>(item: u8, vector: &mut Vec<u8>, func: F)
    where F: Fn(&mut Vec<u8>, usize) -> R
{
    let idx = vector.iter().position(|i| *i == item );
    if let Some(i) = idx {
        func(vector, i);
    }
}

fn main() {
    let mut v = vec![1, 2, 3];
    perform_if_exists(1, &mut v, Vec::remove);
    println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)

我切换到通用,因为通常你会接受闭包.函数指针很好,但限制性更强.