【问题标题】:How to return a &str, avoiding "temporary value dropped while borrowed"如何返回 &str,避免“借用时临时价值下降”
【发布时间】:2021-04-26 01:00:24
【问题描述】:

我在打开 Options 并将值转换为字符串切片时遇到问题。

  • 当 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

【问题讨论】:

  • u8 是单字节,不应该是 [u8] 吗?
  • 或者,它真的是Option&lt;u8&gt;,也许您想将那个 8 位整数转换成它在字符串中的十进制表示?
  • @antoninGRAVIL,并不是真的要成为一个字节字符。把它想象成一个小整数,有害的,是的,更像是我想要的字符串中的十进制表示。
  • 这是因为您从vstr 借用,当它超出范围时会被丢弃。由于您要返回一个引用,因此该引用必须指向比引用更有效的东西。尝试返回 String 而不是 &amp;str
  • @Mel 是的!通过使用 String 我现在可以解决它。

标签: rust


【解决方案1】:

如果您尝试在同一个函数中使用&amp;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);

如果您的目标是将&amp;str 返回给调用者,那么这是不可能的。这是一个借来的值,拥有内存的字符串最多不会超过函数的末尾。您可以返回StringCow&lt;'static, str&gt;

例如,您可以这样做:

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(),
}

【讨论】:

  • 最后一个 sn-p 似乎缺少类型归属,例如let msg: Cow&lt;'static, str&gt; = match val { ... }.
【解决方案2】:

在更一般的情况下,当您无法保留字符串时,您可以使用Cow

let val: Option<u8> = row.get(k);
let msg = match val {
    None => Cow::Borrowed(""),
    Some(v) => Cow::Owned(v.to_string()),
};

现在msg 持有借用或拥有的字符串,具体取决于具体情况。

【讨论】:

    猜你喜欢
    • 2021-03-05
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 2021-05-05
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多