2016-03-28 30 views
0

I (basitleştirilmiş) böyle bir dosya sistemi benzeri bir enum ile yapı, iki yapılar ve BTreeMap, modellenmiş her Dosyada işlem. Bu çalıştı:yinelemeli ziyaret çeteleler

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); 
      } 
     } 
    } 
} 

ama olsun: Ben de

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

çalıştı

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

ama sonra ben birkaç kombinasyonları denedi

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

olsun:

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) => 

ve benzerleri, ancak borç denetçisini mutlu etmenin bir yolunu bulamadılar.

Herhangi bir yardım çok takdir edilmektedir.

cevap

2

Kodunuzla ilgili birçok sorun var.

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. yineleme içine children taşımak için for /* ... */ in index.children denemeden diyor: Burada numaralı değişikliklerle bir çalışma versiyonudur. Bu yüzden neden böyle olduğunu açıklayan someanswers vardır. Tüketmeden yinelemek istiyoruz, ama değerleri mutasyona sokabiliyoruz.
  2. (1.) fonksiyonu da Dir
  3. child bir değişken referansı olması gerekir tip &mut Item bir değişken referanstır yüzünden (bu ne yineleyici verimleri çünkü). Eşleşme bloğundaki desenler (örneğin Item::File(/* ... */)), Item türüne sahiptir. Bu bir tür uyuşmazlığıdır (ikinci derleyici hatası). Bunu,'un * ile kaldırılması yoluyla çözebiliriz.
  4. match bloğu Item ile eşleşiyor, ancak aslında öğenin sahibi biz değiliz ve bunun dışına çıkamıyoruz. Bir hareketi önlemek için ref anahtar kelimesini ekliyoruz. Şimdi f ve d referanslarıdır ve bir hareketten kaçındık.
+0

Teşekkür ederiz! Açıklama 1'de...() (Kullanmaya başladığı için) kullanmaya çalışmamın nedeni. Kullanım kılavuzunun tamamını & & mut, ref ve * ve bunları kullanabileceğiniz yerlerde oldukça kafa karıştırıcı buldum. İşlev argümanlarında ve arama parametrelerinde kullanıldığında ne yaptığını çok açık, ama asla bir maçtan sonra ... ve/veya maçtan sonra ... – Shu