2015-09-09 24 views
3

,和我以前從一個標誌得到一個值是這樣的:變量不活足夠長的時間:我使用getopts的匹配選項類型

let file = matches.opt_str("f").unwrap(); 
let file_path = Path::new(&file); 

但是,我想更好地處理可能出現的錯誤,通過使路徑可選。這是我的新代碼:

let file = matches.opt_str("f"); 
let file_path = match file { 
    Some(f) => Some(Path::new(&f)), 
    None => None 
} 

但是,當我嘗試編譯這段代碼,我得到的錯誤'f' does not live long enough。我完全被難住了。

繼承人我的代碼MCVE:

fn main() { 
    let foo = Some("success".to_string()); 
    let string = match foo { 
     Some(s) => Some(Path::new(&s)), 
     None => None 
    }; 
} 

回答

5

產生的問題是,因爲你是採取的Option內容的所有權在與之相匹配的結合s(使用綁定按值)。然而,由於在比賽後沒有任何東西使用s,它將被丟棄並且導致無效的參考,因此被阻止。

相反,你可以結合,通過參考

let string = match foo { 
    Some(ref s) => Some(Path::new(s)), 
    None  => None, 
}; 

或者你可以從Option<T>得到Option<&T>使用as_ref

let string = match foo.as_ref() { 
    Some(s) => Some(Path::new(s)), 
    None => None, 
}; 

我可能會使用最後一個溶液加上map

let string = foo.as_ref().map(Path::new); 
+0

太棒了!謝謝! –

相關問題