是否可以绑定到对象方法?例如,如果向量中存在某个项目,我有一个向量和许多函数可以执行某些操作.我会按如下方式实现它:
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的方法作为参数添加到函数中.
可能吗
当然是啦.您必须首先修复多个级联错误:
Vec<_>::remove
无效.Vec::remove
修改aVec
,所以你必须以Vec
某种方式传递.Vec::remove
修改 a Vec
,所以你必须声明允许该函数这样做.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)
我切换到通用,因为通常你会接受闭包.函数指针很好,但限制性更强.
归档时间: |
|
查看次数: |
1680 次 |
最近记录: |