如何向 Rust 闭包传递多个参数 - 预期接受一个参数的闭包

4

我对闭包还不熟悉,不明白为什么会出现以下错误。

如果我不包含第二个参数,它就可以工作:

fn obj_x(x: Vec<f64>) -> f64 {
    return 0.0;
};

let f = |x: &Vec<f64>| obj_x(x.to_vec());

这是我的闭包:
fn foo() {
    let f = |x: &Vec<f64>, N: usize| obj_x(x.to_vec(), N);
}

fn obj_x(x: Vec<f64>, N: usize) -> f64 {
    let x = (x[0] + 4.0).powf(2.0);

    return x;
}


但不幸的是,它失败了。
error[E0593]: closure is expected to take 1 argument, but it takes 2 arguments
   --> src/main.rs:120:44
    |
114 |     let f = |x: &Vec<f64>, N: usize | obj_x(x.to_vec(),N);
    |             ------------------------- takes 2 arguments
...
120 |         let mut fmin = Funcmin::new(&mut x,&f,&g,"cg");
    |                                            ^^ expected closure that takes 1 argument
    |

这是我的完整代码:

fn obj_x(x: Vec<f64>, N: usize) -> f64 {
    let x = (x[0] + 4.0).powf(2.0);

    return x;
}

fn gradient_x(x: Vec<f64>) -> Vec<f64> {
    return vec![2.0 * (x[0] + 4.0)];
}

fn test() {
    let f = |x: &Vec<f64>, &N: usize| obj_x(x.to_vec(), N);
    let g = |x: &Vec<f64>| gradient_x(x.to_vec());
    let mut x = vec![40.0f64];
    let mut N = 2220;
    {
        //you must create a mutable object
        let mut fmin = Funcmin::new(&mut x, &f, &g, "cg");
        fmin.minimize();
    }
    println!("{:?}", x);
}

1
Funcmin是什么?问题似乎出在那里。它来自这里吗 - https://github.com/noshu/rustimization? - Cerberus
是的,我正在尝试扩展他们的逻辑,因为我需要传递更多的参数。 - Tampa
1
Funcmin应该如何知道将什么作为第二个参数传递给您的函数?!如果N不是参数而是常量,请在闭包中捕获它。另外,您应该阅读这本书。 - Stargateur
1个回答

0
这是我的解决方案:声明 fn fold(n: u32, init: u32, op: impl Fn(u32, u32) -> u32) -> u32 {... 并调用它: fold(n, 1, |x: u32, y: u32| -> u32 {x + y })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接