代码之家  ›  专栏  ›  技术社区  ›  Tampa

如何将多个参数传递给rust闭包-需要1个参数的预期闭包

  •  0
  • Tampa  · 技术社区  · 6 年前

    我是闭包新手,我不明白为什么会出现以下错误。

    如果我不把第二个论点包括在内,它是有效的:

    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);
    }
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   Vlad Patryshev    5 年前

    这个解决方案对我有效:申报

    fn fold(n: u32, init: u32, op: impl Fn(u32, u32) -> u32) -> u32 {...

    并称之为

    fold(n, 1, |x: u32, y: u32| -> u32 {x + y })