簡體   English   中英

如何返回 &str,避免“借用時臨時價值下降”

[英]How to return a &str, avoiding "temporary value dropped while borrowed"

我在展開選項並將值轉換為字符串切片時遇到問題。

  • 當 Option 具有Some值時,我想將其轉換為&str
  • 當 Option 為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 的末尾。 您可以返回StringCow<'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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM