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

如何将两个定义相同的Rust闭包放入同一个Vec中?

如何将两个定义相同的闭包放入一个Vec中?

Rust的闭包有个关键特性:每个闭包都是独一无二的匿名类型,哪怕代码逻辑完全一致,两个闭包的类型也不相同。你遇到的编译错误就是因为Vec被自动推断为第一个闭包的Box<[closure...]>类型,第二个闭包类型不匹配导致的。

解决方案1:使用Trait Object统一类型

明确指定Vec的元素类型为Box<dyn Fn()>,利用trait object擦除具体闭包类型,只要闭包实现了Fn() trait(无参数、无返回值)就能放入Vec:

fn main() {
    let mut vec: Vec<Box<dyn Fn()>> = Vec::new();
    vec.push(Box::new(|| println!("test")));
    vec.push(Box::new(|| println!("test2")));
    
    vec.iter().for_each(|f| (f)());
}

这种方式适用于所有闭包,不管是否捕获外部环境,但需要通过Box做堆分配,调用时会有轻微的动态分发开销。

解决方案2:使用函数指针(仅适用于无捕获的闭包)

如果你的闭包没有捕获任何外部变量,可以直接用函数指针类型fn(),无捕获的闭包可以强制转换为函数指针:

fn main() {
    let mut vec: Vec<fn()> = Vec::new();
    vec.push(|| println!("test"));
    vec.push(|| println!("test2"));
    
    vec.iter().for_each(|f| (f)());
}

这种方式不需要堆分配,性能更好,但仅限闭包不捕获任何变量的场景。

内容的提问来源于stack exchange,提问作者Preston

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:02:40