gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:46:28 26 4
gpt4 key购买 nike

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

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);
}

但它给出了很多错误。我认为它们是合理的,但这是因为我不明白如何将 vector 的方法作为函数的参数。

最佳答案

Is it possible

当然可以。您必须先修复多个级联错误:

  1. 语法无效:Vec<_>::remove无效。
  2. 不兼容的参数类型:Vec::remove修改 a Vec ,所以你必须传入一个Vec不知何故。
  3. 可变性:Vec::remove 修改 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);
}

我切换到通用,因为这通常是您接受闭包的方式。函数指针很好,但限制更多。

关于rust - 是否可以将对象方法作为参数传递给函数并将其绑定(bind)到对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37391695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com