2015-09-17 13 views
6

Bu elemanın bir koşulu doğruysa, bir vektörden bir eleman almak istiyorum.Bir koşulla karşılaşıldığında bir vektöre nasıl göz atarım?

fn draw() -> Option<String> { 
    let mut v: Vec<String> = vec!["foo".to_string()]; 
    let t: Option<String>; 
    let o = v.last(); 

    // t and v are actually a fields in a struct 
    // so their lifetimes will continue outside of draw(). 

    match o { 
     Some(ref e) => { 
      if check(e) { 
       t = v.pop(); 
       t.clone() 
      } else { 
       None 
      } 
     } 
     None => None, 
    } 
} 

fn check(e: &String) -> bool { 
    true 
} 

fn main() {} 

playground

Bu hata ile sonuçlanır:

anlayın sıralamak
error[E0502]: cannot borrow `v` as mutable because it is also borrowed as immutable 
    --> src/main.rs:12:21 
    | 
4 |  let o = v.last(); 
    |    - immutable borrow occurs here 
... 
12 |     t = v.pop(); 
    |     ^mutable borrow occurs here 
... 
20 | } 
    | - immutable borrow ends here 

, ancak (clone() kullanmadan) ödünç sona erdirmek için bir yol göremiyorum.

+1

Alakasız nit: 'peek' döner' Seçenek <&String> 'desen' Bazı (ref e) 'gereksiz hale getirir böylece' e: && String' Bunu yapmanın bir yolu, fonksiyonel tarzı haritasıdır. Sadece "(e)" yaz. – delnan

cevap

7

Borrows sözdizimidir, bu nedenle v tüm işlevin ömrüne sahiptir. Biri kapsamı azaltabilirse, last() ve pop() kullanılabilir.

let mut v: Vec<String> = vec!["foo".to_string()]; 
if v.last().map_or(false, check) { 
    v.pop() 
} else { 
    None 
} 
İlgili konular