Pierre-olivier Gendraud
Pierre-olivier Gendraud

Reputation: 1897

How to create a vector of functions from an iterator of functions

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

Upvotes: 0

Views: 97

Answers (2)

Pierre-olivier Gendraud
Pierre-olivier Gendraud

Reputation: 1897

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

Upvotes: 0

rochard4u
rochard4u

Reputation: 736

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.

Upvotes: 1

Related Questions