【问题标题】:Rust E0382 - value used here after moveRust E0382 - 移动后此处使用的值
【发布时间】:2022-11-27 03:17:54
【问题描述】:

我是 Rust 的新手,并且真的在努力寻找以 Rust 方式编写代码的方法。我了解其强制执行内存正确性的规则,但是我无法弄清楚遵守代码所需的更改。

我从应用程序收到的 json 结构中创建了一个类似树的对象。

我正在尝试在树上创建两个操作,

  1. 获取树的叶子
  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 变量。我理解它的抱怨,但是,我无法弄清楚解决它的正确 Rust 方法应该是什么。

    请帮我弄清楚解决这个问题所需的思维转变。这很重要,因为我的应用程序确实需要多次对树结构执行这些计算。

    有趣的是,我并没有真正改变结构,只是迭代它并从函数返回新的/改变的结构。

    来源链接:https://github.com/madhur/i3-auto-workspace-icons-rust/blob/main/src/main.rs

【问题讨论】:

    标签: rust rust-cargo i3


    【解决方案1】:

    问题是您已经声明了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 也不是。

    2. 除非有意义,否则不要拥有价值观。通过 & 引用传递是一个很好的默认选择(Copy 类型除外,例如数字)。

    【讨论】:

      猜你喜欢
      • 2021-06-01
      • 2015-11-17
      • 1970-01-01
      • 2021-02-13
      • 1970-01-01
      • 2021-11-09
      • 2020-06-21
      • 2016-07-11
      • 1970-01-01
      相关资源
      最近更新 更多