[英]How to return a &str, avoiding "temporary value dropped while borrowed"
我在展開選項並將值轉換為字符串切片時遇到問題。
Some
值時,我想將其轉換為&str
。None
時,我只返回一個空字符串切片""
。例如:
let val: Option<u8> = row.get(k);
match val {
None => "",
Some(v) => v.to_string().as_str()
}
但這會因為這樣的錯誤而失敗。
temporary value dropped while borrowed
consider using a `let` binding to create a longer lived value rustc E0716
main.rs(.....): temporary value is freed at the end of this statement
我嘗試過以各種不同的方式分解它,例如像這樣
let val: Option<u8> = row.get(k);
match val {
None => "",
Some(v) => {
let vstr = v.to_string();
vstr.as_str()
}
}
但我還是真的被困住了。 我已經查看了許多類似的問題,但沒有一個是完全相同的,我仍然被卡住了。 我怎樣才能做到這一點?
澄清一下,我想要 tinyint 的十進制表示,而不是字符點。 這不是 utf8 字符串,只是一個數字。
let x: u8 = 10;
let s: String = x.to_string();
println!("10 = {}", s);
這應該打印10 = 10
如果您嘗試在同一個 function 中使用&str
,則可以提升聲明以使字符串的壽命足夠長:
let val: Option<u8> = row.get();
let vstr;
let msg = match val {
None => "",
Some(v) => {
vstr = v.to_string();
vstr.as_str()
}
};
println!("value is {}", msg);
如果您的目標是將&str
返回給調用者,那么這是不可能的。 這是一個借來的值,擁有 memory 的字符串最多不會超過 function 的末尾。 您可以返回String
或Cow<'static, str>
。
例如,您可以這樣做:
let val: Option<u8> = row.get();
match val {
None => "".to_owned(),
Some(v) => v.to_string(),
}
或這個:
let val: Option<u8> = row.get();
match val {
None => "".into(),
Some(v) => v.to_string().into(),
}
在更一般的情況下,當您無法保留字符串時,您可以使用Cow
:
let val: Option<u8> = row.get(k);
let msg = match val {
None => Cow::Borrowed(""),
Some(v) => Cow::Owned(v.to_string()),
};
現在msg
根據情況保存借用或擁有的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.