2016-04-13 15 views
0

Ben pat_vec ve str_vec iki yineleyiciler olan bu kodu vardır:Nasıl Geçici Çözüm Pas'ın HashMap'in borcunu kontrol eder?

let mut pat_mapping: HashMap<char, &str> = HashMap::new(); 

for combi in pat_vec.zip(str_vec) { 
    let (c, word) = combi; 

    match pat_mapping.get(&c) { 
     Some(phrase) => { 
      if phrase.to_string() != word.to_string() { 
       return false; 
      } 
     } 

     None => { 
      pat_mapping.insert(c, word); 
     } 
    } 
} 

Bu işe yaramazsa ve derleyici şikayet:

cannot borrow `pat_mapping` as mutable because it is also borrowed as immutable [E0502] 

Ben pat_mapping.get(&c)&self olarak değişmez ödünç çünkü anlamak insert() yöntemi aynı kapsamda iken, &self kodunun mutable olarak kullanılması gerekir.

Etrafa bir iş var:

match word_mapping.get(&c) { 
    Some(phrase) => { 
     if phrase.to_string() != word.to_string() { 
      return false; 
     } 
    } 
    None => { 

     pat_trigger = true; 
    } 

}; 

if pat_trigger { 
    pat_mapping.insert(c, word); 
} 

Ama bir boolean bayrak tanıtan gereksiz olduğunu. Eşleşmeyi yapmak ve aynı kod bloğuna eklemek için borç kontrolünün etrafında çalışmak için bir yol var mı?

cevap

1

Sen entry kullanmak istiyorum:

match pat_mapping.entry(c) { 
    Occupied(phrase) => { 
     if phrase.get().to_string() != word.to_string() { 
      return false; 
     } 
    }, 
    Vacant(vacant) => { 
     vacant.insert(word); 
    } 
} 

Ayrıca sadece bir kez anahtar ararken avantajına sahiptir.

İlgili konular