我是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
1条答案
按热度按时间6vl6ewon1#
问题是您声明了
I3Info
的方法,使得它们使用(移动)I3Info
:为了 * 不 * 使用
I3Info
,允许它被多次使用,请声明您的方法接受 * 对 *I3Info
的引用:您需要修改这些方法中的代码,也就是修改引用,因为这一修改也意味着您不能再将内容移出
self
--它们必须保持原样。有时这就像将&
放在字段访问之前一样简单(&self.foo
代替self.foo
),有时则需要更广泛的修改。“生 rust 的思维方式”的一般教训如下:
1.考虑一下方法接收器的类型。
self
并不总是正确的,&self
也不总是正确的。1.除非有意义,否则不要获取值的所有权。通过
&
引用传递是一个很好的默认选择(除了Copy
类型,如数字)。