这个问题在这里已有答案:
我希望将使用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
时,这是有效的,但我宁愿不这样做,因为这会在原始代码库中引起很多麻烦。
而且,这看起来像是一种警察,因为那时我仍然不知道为什么会失败。
我将如何系统地解决这个问题?
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")
};