Я столкнулся с этой проблемой, когда 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);
В этом коде тип category
представляет собой &str
, что удовлетворяется возвращением литерала, подобного "Between 0 and 9"
. Если я хочу отформатировать сопоставленное значение в срез, используя as_str()
, я получаю сообщение об ошибке:
error[E0716]: temporary value dropped while borrowed
--> src/main.rs:5:24
|
3 | let category = match x {
| -------- borrow later stored here
4 | 0...9 => "Between 0 and 9",
5 | number @ 10 => format!("It's a {}!", number).as_str(),
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - temporary value is freed at the end of this statement
| |
| creates a temporary which is freed while still in use
|
= note: consider using a `let` binding to create a longer lived value
= note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
Я немного почитал и нашел людей с похожими проблемами, но, похоже, я не смог найти никакого решения.
Простой обходной путь: category
будет String
вместо &str
, но мне не нравится идея ставить .to_string()
в конце каждого литерала в шаблоне, как это не так чисто.
Есть ли способ решить проблему, или мне просто нужно обойти ее?