Rust中将for循环转为迭代器实现二维向量报错,求解决方案
问题:迭代器风格初始化二维
Vec<Vec<Cell>>时类型不匹配 想要构建自定义类型Cell的二维向量Vec<Vec<Cell>>,用for循环已成功实现默认初始化,但改用迭代器风格实现时出现类型不匹配错误,相关代码及错误信息如下:
原for循环代码
let mut data: Vec<Vec<Cell>> = Vec::new(); for _i in 0..63 { let mut row: Vec<Cell> = Vec::with_capacity(64); for _j in 0..63 { row.push(Cell::default()) } data.push(row); }
尝试的迭代器代码
let data: Vec<Vec<Cell>> = Vec::with_capacity(64) .iter_mut() .map(|mut x: &mut Vec<Cell>| { x = Vec::with_capacity(64) .iter_mut() .map(|mut y: Cell| y = Cell::default()) .collect() }) .collect();
错误信息
error[E0631]: type mismatch in closure arguments --> src/types.rs:124:26 | 124 | .map(|mut y: Cell| y = Cell::default()) | ^^^ ------------- found signature defined here | | | expected due to this | = note: expected closure signature `fn(&mut _) -> _` found closure signature `fn(types::cell::Cell) -> _` note: required by a bound in `map` --> /home/naitik/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs:779:12 | 779 | F: FnMut(Self::Item) -> B, | ^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `map`
问题原因
- 逻辑完全不符:
Vec::with_capacity(64)仅预分配内存,不会创建任何元素,调用iter_mut()会得到空迭代器,后续的map逻辑根本不会执行,和原for循环循环63次生成元素的逻辑完全不同。 - 类型不匹配:内层
Vec::with_capacity(64).iter_mut()返回的迭代项类型是&mut _(可变引用),但你在闭包里声明参数为Cell(值类型),导致闭包签名与map要求的不匹配,这就是错误提示的核心原因。
修复方案
简洁版(与原逻辑一致)
直接用范围迭代器模拟原for循环的循环次数,通过两次map+collect实现:
let data: Vec<Vec<Cell>> = (0..63) .map(|_| { // 生成每行的63个Cell默认值并收集为Vec<Cell> (0..63).map(|_| Cell::default()).collect() }) .collect();
保留预分配容量的版本(和原for循环完全对齐)
如果需要像原代码一样预分配容量,可以手动创建带容量的Vec后填充元素:
let data: Vec<Vec<Cell>> = (0..63) .map(|_| { let mut row = Vec::with_capacity(64); // 填充63个Cell默认值 row.extend((0..63).map(|_| Cell::default())); row }) .collect();
内容的提问来源于stack exchange,提问作者Naitik Mundra
相关产品推荐
相关产品推荐

