如何将两个定义相同的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
相关产品推荐
相关产品推荐

