You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从函数迭代器创建函数向量?(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 02:24:29