我正在使用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
    };
}
这个问题的出现是因为你取得所有权的内容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);
| 归档时间: | 
 | 
| 查看次数: | 543 次 | 
| 最近记录: |