Reputation: 1897
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]
Upvotes: 0
Views: 97
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)
}
Upvotes: 0
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