【问题标题】:Temporary value dropped while borrowed (E0506)借入时临时价值下降 (E0506)
【发布时间】:2023-03-15 14:49:01
【问题描述】:

我有以下代码:

let mut v2: Value;
let mut ts = v["response"]["ts"].as_str().unwrap();

...

loop {

        v2 = longpoll_question(server.clone(),ts,key.clone());
        if v2["ts"].as_str() == None {
            continue;
        }
        ts = v2["ts"].as_str().unwrap();

...

}

在这里,我从服务器获取 JSON 格式的响应,然后从中检索下一个对服务器的请求所需的“ts”值。有时服务器返回的值是“None”(可能是网络问题或远程 API 问题),这会导致崩溃,所以我决定在展开之前检查该值是否为 None。然而,这拒绝用E0506 编译,我不知道为什么。你能解释一下吗?

【问题讨论】:

  • 请向我们展示完整的错误信息,最好是重现问题的代码。根据给出的信息,这很难回答。
  • 我们没有足够的信息。 v 是什么? Value 的类型是什么?价值在哪里下降,下降后的用途在哪里? IMO,解决方案是将v2 的内容的所有权授予ts,但我没有足够的信息来确定这是一个好的解决方案

标签: rust compiler-errors borrow-checker


【解决方案1】:

我设法通过将 ts 的类型更改为 String 并使用 to_string() 来解决这个问题。我认为 ts 作为 &str 是对 v2 的数据的引用,所以在不删除 ts 的情况下删除 v2 是不可能的。

【讨论】:

  • 是的,这意味着整个字符串被复制到其他地方并因此被复制。如果您不是特别需要出色的性能,这很容易而且很棒,但是如果您需要非常高的性能,那就很糟糕了
  • 如果你的Value实际上是json::JsonValue,那么最好使用take_string来避免不必要的分配和复制。
猜你喜欢
  • 2021-03-05
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
相关资源
最近更新 更多