gpt4 book ai didi

loops - 递归访问 HashMap 中的枚举

转载 作者:行者123 更新时间:2023-11-29 08:27:38 24 4
gpt4 key购买 nike

我用一个枚举、两个结构和一个 BTreeMap 模拟了一个类似文件系统的结构,就像这样(简化):

pub enum Item {
Dir(Dir),
File(File),
}

struct Dir {
...
children: BTreeMap<String, Item>,
}

struct File {
...
}

现在我需要遍历一个目录并对每个文件做一些操作。我试过这个:

fn process(index: &Dir) {
for (_, child) in index.children {
match child {
Item::File(mut f) => {
let xyz = ...;
f.do_something(xyz);
},
Item::Dir(d) => {
process(&d);
}
}
}
}

但我得到:

error: cannot move out of borrowed content [E0507]
for (_, child) in index.children {
^~~~~

我也试过

for (_, child) in index.children.iter() {

但后来我明白了

error: mismatched types:
expected `&Item`,
found `Item`
(expected &-ptr,
found enum `Item`) [E0308]
src/... Item::File(mut a) => {
^~~~~~~~~~~~~~~~~

我尝试了几种组合:

for (_, child) in &(index.children)
for (_, child) in index.children.iter().as_ref()

match(child) { Item::File(&mut f) =>
match(child) { Item::File(ref mut f) =>

等等,但找不到让借阅检查员开心的方法。

非常感谢任何帮助。

最佳答案

您的代码存在多个问题。这是一个带有编号更改的工作版本:

fn process(index: &mut Dir) {
// ^^^-- #2
for (_, child) in &mut index.children {
// ^^^-- #1
match *child {
//^-- #3
Item::File(ref mut f) => {
// ^^^-- #4
f.do_something();
},
Item::Dir(ref mut d) => {
// ^^^-- #4
process(d);
}
}
}
}
  1. for/* ... */in index.children 试图将 children 移动到迭代中。已经有 some answers在 SO 上解释为什么会这样。我们希望在不消耗的情况下进行迭代,但能够改变值。
  2. 因为 (1.) 函数还需要有一个 可变Dir 的引用
  3. child&mut Item 类型的可变引用(因为这是迭代器产生的结果)。匹配 block 中的模式(例如 Item::File(/* ... */))的类型为 Item。这是类型不匹配(您的第二个编译器错误)。我们可以通过使用 * 取消引用 child 来解决这个问题。
  4. 因此 match block 与 Item 匹配,但我们实际上并不拥有该项目,也无法从中移出。为了防止移动,我们添加了 ref 关键字。现在 fd 是引用,我们避免了移动。

关于loops - 递归访问 HashMap 中的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36262867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com