变量的寿命不够长:匹配选项类型

Chr*_*mas 3 lifetime rust

我正在使用getopts,而我之前从这样的标志中获取了一个值:

let file = matches.opt_str("f").unwrap();
let file_path = Path::new(&file);
Run Code Online (Sandbox Code Playgroud)

但是,我想通过使路径可选来更好地处理可能的错误.这是我的新代码:

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

但是,当我尝试编译此代码时,我收到错误'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
    };
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 5

这个问题的出现是因为你取得所有权的内容Option在与之相匹配的结合s(使用绑定按值).但是,由于s在匹配臂之后没有任何使用,它将被丢弃并导致无效引用,因此它被阻止.

相反,您可以通过引用绑定:

let string = match foo {
    Some(ref s) => Some(Path::new(s)),
    None        => None,
};
Run Code Online (Sandbox Code Playgroud)

或者您可以Option<&TOption<T>使用中获得> as_ref:

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

我可能会使用最后的解决方案map:

let string = foo.as_ref().map(Path::new);
Run Code Online (Sandbox Code Playgroud)