I happened upon this problem where format!
creates a temporary value in a pattern that is not anchored to anything, as far as I understand it.
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);
In this code, the type of category
is a &str
, which is satisfied by returning a literal like "Between 0 and 9"
. If I want to format the matched value to a slice using as_str()
, then I get an error:
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)
I have done some reading, and found people with similar problems, but I couldn't seem to find any solution.
A simple workaround would be to have category
be a String
instead of a &str
, but I don't like the idea of having to put .to_string()
on the end of every literal in the pattern, as it's not as clean.
Is there a way to solve the problem, or do I just need to work around it?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…