如何从函数迭代器创建函数向量?(Rust语言)
解决Rust闭包迭代器转dyn Fn向量的问题
错误原因
闭包属于具体的匿名类型,而&dyn Fn(&Int)->Int是 trait 对象引用,Rust无法自动将具体闭包的引用隐式转换为 trait 对象引用,必须显式完成类型转换。
修正方案1:装箱trait对象后收集引用
struct Int { i: i32 } fn main() { let adder = move |x: &Int| Int { i: x.i + 1 }; // 将闭包装箱为dyn Fn trait对象,存入向量 let v_adder: Vec<Box<dyn Fn(&Int) -> Int>> = vec![Box::new(adder)]; // 转换为trait对象引用并收集 let nv_adder: Vec<&dyn Fn(&Int) -> Int> = v_adder.iter().map(|boxed_fn| boxed_fn.as_ref()).collect(); }
修正方案2:迭代时显式类型转换
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(); // 显式将闭包引用转为dyn Fn trait对象引用 let nv_adder: Vec<&dyn Fn(&Int) -> Int> = i_adder.map(|f| f as &dyn Fn(&Int) -> Int).collect(); }
说明
两种方案的核心都是完成具体闭包类型到trait对象的显式转换:
- 方案1通过
Box::new将闭包存储到堆上,生成trait对象,再通过as_ref()获取其引用; - 方案2直接利用类型强制转换,将闭包引用转为对应的trait对象引用,前提是闭包实现了目标trait。
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

