Rust嵌套for循环遍历两个枚举报移动值使用错误如何解决
Rust 嵌套遍历枚举报 moved value 错误的原因与解决方案
错误原因
- 你的
Colors、Numbers枚举默认未实现Copytrait,枚举值赋值给Card结构体字段时会发生所有权转移 - 外层循环拿到的
color变量,第一次进入内层循环构造Card实例时就被移动走,内层循环第二次迭代时color已经是被释放的无效值,因此触发编译错误 - 单循环场景下不会报错,是因为每个
color仅被使用一次,不存在重复使用被移动值的情况
解决方案
方案1:给枚举派生Copy、Clone trait(推荐)
你的枚举都是无额外字段的单元变体,直接添加派生属性即可:
#[derive(Debug, EnumIter, Copy, Clone)] enum Colors { Hearts, Spades, Diamonds, Clubs } #[derive(Debug, EnumIter, Copy, Clone)] enum Numbers { Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace }
实现Copy后枚举值赋值时会自动拷贝,不会转移所有权,你原来的嵌套循环代码无需修改即可正常运行。
方案2:构造Card时手动克隆枚举值
如果不想给枚举实现Copy,可以仅派生Clone trait,赋值时手动调用克隆方法:
首先修改枚举派生:
#[derive(Debug, EnumIter, Clone)] enum Colors { /* 变体保持不变 */ } #[derive(Debug, EnumIter, Clone)] enum Numbers { /* 变体保持不变 */ }
再修改嵌套循环代码:
fn main() { for color in Colors::iter() { for number in Numbers::iter() { let card = Card { color: color.clone(), number: number.clone() }; println!("My card is a {:?} of {:?}", card.number, card.color); } } }
内容的提问来源于stack exchange,提问作者DaWastl
相关产品推荐
相关产品推荐

