Rust E0382错误:值移动后重复使用的解决方案求助
解决Rust中变量移动后无法复用的问题
你的问题根源在于get_leaves和dfs_parent_child方法的参数是self(会获取对象所有权),导致第一次调用后i3_info被移动,无法再次使用。因为你的操作都是只读遍历,不需要拿走原对象的所有权,正确的解决方式是修改方法签名使用不可变引用:
步骤1:修改方法签名
把两个方法的参数从self改成&self:
// 原方法签名(示例) // fn get_leaves(self) -> Vec<YourLeafType> { ... } // fn dfs_parent_child(self) -> YourMapType { ... } // 修改后 fn get_leaves(&self) -> Vec<YourLeafType> { // 内部遍历逻辑保持不变,只需确保遍历的是引用而非所有权转移 // 比如遍历节点时用 &Node 而非 Node } fn dfs_parent_child(&self) -> YourMapType { // 同理,内部逻辑使用引用访问树形结构 }
步骤2:保持调用代码不变
修改方法签名后,原调用代码无需改动:
fn rename_workspaces(conn: Connection) { let i3_info = I3Info::new(conn); let _leaves = i3_info.get_leaves(); let _parent_child = i3_info.dfs_parent_child(); }
Rust会自动将i3_info转换成不可变引用传给方法,此时i3_info的所有权不会被转移,可以被多次调用复用。
为什么这样可行?
Rust的不可变引用规则允许同一时间存在多个不可变引用,完全适配你这种多次对同一只读结构执行计算的场景,既保证了内存安全,又满足了业务需求。
内容的提问来源于stack exchange,提问作者Madhur Ahuja
相关产品推荐
相关产品推荐

