匹配表达式格式!()的生命周期太短

run*_*alk 2 rust

我正在Display::fmt为我自己的struct 实现一个自定义的自定义.

struct Range<T> {
    lower: Option<T>,
    upper: Option<T>,
}
Run Code Online (Sandbox Code Playgroud)

范围可以是Range { lower: Some(1), upper: None },这意味着它包含从1到无穷大(或i32我想象的极限)的所有整数.

我想实现Display::fmt使用T's Display::fmt如果绑定不是,None并显示一个空字符串否则:

let range = Range { lower: Some(1), upper: None }
println!("{}", range); // Prints <1,>

let range = Range { lower: Some(1), upper: Some(10) }
println!("{}", range); // Prints <1,10>

let range = Range { lower: None, upper: Some(10) }
println!("{}", range); // Prints <,10>
Run Code Online (Sandbox Code Playgroud)

我已经开始实现了,但是在match表达式和生成的字符串的生命周期方面遇到了麻烦format!().我的实现的问题是格式返回的字符串活不够长,无法进一步使用.

fn main() {
    let opt = Some(1);

    let opt_display = match opt {
        Some(x) => &format!("{}", x), // error: borrowed value does not live long enough
        None => "",
    };

    println!("opt: {}", opt_display);
}
Run Code Online (Sandbox Code Playgroud)

为什么我的方法不起作用,什么是我的问题的一个很好的解决方案?

小智 5

我不是终身专家,但我相信这里的问题是你试图&String从比赛中的一个String创造出来format!.由于格式的范围仅在范围内,借用检查员会抱怨.

要解决此问题,您可以使用拥有的字符串.

fn main() {
    let opt = Some(1);

    let opt_display = match opt {
        Some(ref x) => format!("{}", x), // Allowed since opt_display now owns the string
        None => "".into(),
    };
    // Another way to achieve the same thing.
    //let opt_display = opt.map(|s| format!("{}", s)).unwrap_or("".into());

    println!("opt: {}", opt_display);
}
Run Code Online (Sandbox Code Playgroud)