我如何制作格式!从条件表达式返回 &str?

Bja*_*sen 8 string scope temporary lifetime rust

我遇到了这个问题format!,据我所知,在一个没有锚定到任何东西的模式中创建一个临时值。

let x = 42;
let category = match x {
    0...9 => "Between 0 and 9",
    number @ 10 => format!("It's a {}!", number).as_str(),
    _ if x < 0 => "Negative",
    _ => "Something else",
};

println!("{}", category);
Run Code Online (Sandbox Code Playgroud)

在这段代码中, 的类型category是 a &str,它通过返回一个像 的文字来满足"Between 0 and 9"。如果我想使用 将匹配的值格式化为切片as_str(),则会出现错误:

let x = 42;
let category = match x {
    0...9 => "Between 0 and 9",
    number @ 10 => format!("It's a {}!", number).as_str(),
    _ if x < 0 => "Negative",
    _ => "Something else",
};

println!("{}", category);
Run Code Online (Sandbox Code Playgroud)

我做了一些阅读,发现有类似问题的人,但我似乎找不到任何解决方案。

一个简单的解决方法是category使用 aString而不是 a &str,但我不喜欢必须将.to_string()模式中的每个文字放在末尾的想法,因为它不那么干净。

有没有办法解决这个问题,还是我只需要解决它?

She*_*ter 7

这是Return local String as a slice (&str) 的90% 的副本,请参阅其他多个解决方案。

还有一种额外的可能性,因为这一切都在一个函数中:您可以为 声明一个变量,String并且仅在需要分配时才设置它。编译器(斜)建议:

考虑使用let绑定来创造更长久的价值

fn main() {
    let x = 42;
    let tmp;

    let category = match x {
        0...9 => "Between 0 and 9",
        number @ 10 => {
            tmp = format!("It's a {}!", number);
            &tmp
        }
        _ if x < 0 => "Negative",
        _ => "Something else",
    };

    println!("{}", category);
}
Run Code Online (Sandbox Code Playgroud)

这与使用 a 大致相同Cow,只是由编译器处理而不是特定类型。

也可以看看: