Rust中如何调用Box内存储的dyn函数并获取迭代器?
Rust调用Box包裹的返回动态迭代器的函数的正确方式
编译错误的核心原因是:dyn Iterator属于未大小化类型(unsized type),Rust不允许函数直接返回这类无固定大小的值,必须将其包裹在指针类型(如Box)中才能作为合法的函数返回值。原代码里闭包的返回类型是裸的dyn Iterator<Item=usize>,违反了这个规则,因此无法通过编译。
修正后的代码
use std::sync::{Arc, Mutex}; pub struct TaskGroup { // 调整闭包的返回类型为Box包裹的迭代器trait object task_group: Arc<Mutex<Box<dyn Fn() -> Box<dyn Iterator<Item=usize>>>>>, } impl TaskGroup { fn foo(&self) { // 调用闭包得到Box<dyn Iterator>,直接遍历即可 for task in self.task_group.lock().unwrap()() { // 这里添加对task的处理逻辑 } } }
关键说明
- 把闭包的返回值从
dyn Iterator<Item=usize>改为Box<dyn Iterator<Item=usize>>,Box是一个拥有所有权的指针,它的大小是固定的(等同于平台指针的大小),符合Rust对函数返回值必须是Sized类型的要求。 - 调用闭包后得到的
Box<dyn Iterator<Item=usize>>可以直接用于for循环遍历,因为Rust会自动解引用Box,将其当作迭代器处理。
如果不需要动态分发(即所有闭包都返回同一种具体的迭代器类型),也可以使用impl Iterator<Item=usize>作为闭包的返回类型,这样能获得更好的性能,但这种写法只能用于静态分发场景。
内容的提问来源于stack exchange,提问作者Makogan
相关产品推荐
相关产品推荐

