生 rust E0382 -移动后此处使用的值

tnkciper  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(142)

我是Rust的新手,真的很难用Rust的方式编写代码。我理解它的规则来强制内存正确性,但是我不能弄清楚在代码中遵守所需的更改。
我已经创建了一个树状对象从json结构收到的应用程序。
我尝试在树上创建两个操作:
1.获取树叶
1.获取Map中父级-〉子级的Map
高级代码如下所示

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变量在移动后被使用了。我理解它的抱怨,但是,我不知道什么应该是正确的Rust解决它的方法。
请帮助我弄清楚解决这个问题所需的思维变化。这很重要,因为我的应用程序确实需要多次在树结构上执行这些计算。
有趣的是,我并没有真正改变结构,只是在它上面迭代,并从函数中返回新的/改变的结构。
来源链接:https://github.com/madhur/i3-auto-workspace-icons-rust/blob/main/src/main.rs

6vl6ewon

6vl6ewon1#

问题是您声明了I3Info的方法,使得它们使用(移动)I3Info

pub fn dfs_parent_child(self) ...
   pub fn get_leaves(self) ...

为了 * 不 * 使用I3Info,允许它被多次使用,请声明您的方法接受 * 对 * I3Info的引用:

pub fn dfs_parent_child(&self) ...
   pub fn get_leaves(&self) ...

您需要修改这些方法中的代码,也就是修改引用,因为这一修改也意味着您不能再将内容移出self--它们必须保持原样。有时这就像将&放在字段访问之前一样简单(&self.foo代替self.foo),有时则需要更广泛的修改。
“生 rust 的思维方式”的一般教训如下:
1.考虑一下方法接收器的类型。self并不总是正确的,&self也不总是正确的。
1.除非有意义,否则不要获取值的所有权。通过&引用传递是一个很好的默认选择(除了Copy类型,如数字)。

相关问题