0

I have an iterator of functions (i_adder). I want to get a vector(nv_adder) from this iterator.

struct Int{
    i : i32
}


fn main() {

    let adder = move |x : &Int| Int{ i: x.i + 1}; 
    let v_adder=vec![adder];
    let i_adder=v_adder.iter();
    let nv_adder=i_adder.collect::<Vec<&dyn Fn(&Int)->Int>>();
}

error[E0277]: a value of type Vec<&dyn for<'r> Fn(&'r Int) -> Int> cannot be built from an iterator over elements of type &[closure@src/main.rs:8:17: 8:49]

code

2 Answers2

1

Using the Box smart pointer and type specification :

fn main() {

    let adder = move |x : &Int| Int{ i: x.i + 1}; 
    let v_adder: Vec<Box<dyn Fn(&Int) -> Int>>=vec![Box::new(adder)];
    let i_adder=v_adder.iter();
    let nv_adder=i_adder.collect::<Vec<&Box<dyn Fn(&Int) -> Int>>>();
}

You need the Box smart pointer since the compilator does not know the size of a trait object at compile time.

rochard4u
  • 629
  • 3
  • 17
0

This code works. But I still don´t know what why collect doesn´t work.

struct Int{
    i : i32
}


fn main() {

    let adder = move |x : &Int| Int{ i: x.i + 1}; 
    let v_adder=vec![adder];
    let i_adder=v_adder.iter();
    let v = Vec::from_iter(i_adder);
    let p= v[0](&Int{i:1}).i;
    println!("{}",p)

}

code