如何将临时字符串转换为&str? [重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

我希望将使用String宏创建的format!转换为&str,并使用let绑定将其分配给值:

fn main() {
    let my_bool = true;
    let other = String::from("my_string");
    let result = if my_bool {
        format!("_{}", other).as_str()
    } else {
        "other"
    };

    println!("{}", result);
}

(Qazxswpoi)

当我这样做时,编译器抱怨临时Rust Playground值在语句结束时释放(从我所理解的),这意味着我无法动态创建String

&str

我一直在努力了解Rust的终生系统,但我无法真正理解这一点。 Rust建议如下:

error[E0716]: temporary value dropped while borrowed
 --> src/main.rs:5:9
  |
4 |     let result = if my_bool {
  |         ------ borrow later stored here
5 |         format!("_{}", other).as_str()
  |         ^^^^^^^^^^^^^^^^^^^^^ creates a temporary which is freed while still in use
6 |     } else {
  |     - temporary value is freed at the end of this statement
  |

我用 = note: consider using a `let` binding to create a longer lived value 绑定包裹format!("_{}", other)

let

但它似乎没有解决这个问题,因为当我在这个绑定上调用fn main() { let my_bool = true; let other = String::from("my_string"); let result = if my_bool { let s = format!("_{}", other); s.as_str() } else { "other" }; println!("{}", result); } 时,它仍然抱怨借来的价值不够长寿:

as_str()

当我省略整个error[E0597]: `s` does not live long enough --> src/main.rs:6:9 | 4 | let result = if my_bool { | ------ borrow later stored here 5 | let s = format!("_{}", other); 6 | s.as_str() | ^ borrowed value does not live long enough 7 | } else { | - `s` dropped here while still borrowed 时,这是有效的,但我宁愿不这样做,因为这会在原始代码库中引起很多麻烦。

而且,这看起来像是一种警察,因为那时我仍然不知道为什么会失败。

我将如何系统地解决这个问题?

rust format lifetime
1个回答
4
投票

if是一个借来的字符串,所以你不能从一个临时的&str得到一个,否则一个引用会比它所绑定的值更长。

但是,您可以使用String类型来执行您想要的操作:

Cow

use std::borrow::Cow; fn main() { let my_bool = true; let other = String::from("my_string"); let result = if my_bool { Cow::Owned(format!("_{}", other)) } else { Cow::Borrowed("other") }; assert_eq!("_my_string", result); } (写于克隆)是一个Cow,拥有自有或借用的数据。在这种特殊情况下,enum的类型为result

您可以通过编写来简化表示法:

Cow<str>

或(风格问题):

let result = if my_bool {
    format!("_{}", other).into()
} else {
    Cow::Borrowed("other")
};
© www.soinside.com 2019 - 2024. All rights reserved.