0
私は、列挙型、2つの構造体と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);
}
}
}
}
を私は得る:私も
for (_, child) in index.children.iter() {
を試してみました
error: cannot move out of borrowed content [E0507]
for (_, child) in index.children {
^~~~~
が、その後、私は、私はいくつかの組み合わせを試してみました
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) =>
などですが、借用チェッカーを幸せにする方法が見つかりませんでした。
ご迷惑をおかけして申し訳ありません。
ありがとうございます!あなたの説明は1 .iter()(参照を返すため)を使用しようとした理由です。 マニュアル全体、&mut、ref、*、そしてそれらを使うことができる場所が非常に混乱していました。関数の引数や呼び出しパラメータで使われたときの動作ははっきりしていますが、for ...やa *の後に&mutを使ったことはありませんでした。 – Shu