使用Rayon并行迭代树对象时遇Sized trait不满足问题求助
Rayon并行迭代Vec时Sized trait约束不满足的问题
问题描述
我持有一个Vec<ValidRelationshipTree>集合,希望通过Rayon的并行迭代器对每棵树做并行处理,但编译时触发错误,提示ValidRelationshipTree未满足std::marker::Sized trait约束。可实际上这个结构体的大小在编译时是明确可知的(标注为16字节,对齐8字节)。
相关结构体定义
ValidRelationshipTree
// size = 16 (0x10), align = 0x8 struct ValidRelationshipTree { root: RefCell<Rc<ValidRelationshipNode>>, }
ValidRelationshipNode
struct ValidRelationshipNode { payload: String, extended: String, parent: RefCell<Weak<ValidRelationshipNode>>, // 使用Weak<T>避免引用循环 children: RefCell<Vec<Rc<ValidRelationshipNode>>>, }
编译错误详情
the method `into_par_iter` exists for struct `Vec<ValidRelationshipTree>`, but its trait bounds were not satisfied the following trait bounds were not satisfied: `[metadata::relationships::ValidRelationshipTree]: std::marker::Sized` which is required by `[metadata::relationships::ValidRelationshipTree]: rayon::iter::IntoParallelIterator` `[metadata::relationships::ValidRelationshipTree]: rayon::iter::ParallelIterator` which is required by `[metadata::relationships::ValidRelationshipTree]: rayon::iter::IntoParallelIterator`
可正常运行的顺序迭代代码
let forest: Vec<ValidRelationshipTree> = self.generate_relationship_trees(n_tables, true); let mut extended: Vec<String> = forest .into_iter() .flat_map(|tree: ValidRelationshipTree| { tree.nodes_with_length(n_tables) .into_iter() .map(|node: Rc<ValidRelationshipNode>| node.extended().clone()) }) .collect();
触发错误的并行迭代代码
let forest: Vec<ValidRelationshipTree> = self.generate_relationship_trees(n_tables, true); let extended_par: Vec<String> = forest .into_par_iter() // ERROR: 以下 trait 约束未满足: // [metadata::relationships::ValidRelationshipTree]: std::marker::Sized` .map(|node| node.extended().clone()) .collect();
我的疑问
明明ValidRelationshipTree的编译时大小是确定的,为什么会被判定未实现Sized?我查阅过Sized trait文档、Rayon相关问题,甚至尝试为Vec<ValidRelationshipTree>创建包装结构体,都无法解决这个问题,希望有人能填补我的知识盲区,给出解决方案。
内容的提问来源于stack exchange,提问作者ejovo13
相关产品推荐
相关产品推荐

