设置为 Map 时,Rust `移动后在这里借用的值`

Rust `value borrowed here after move` when setting to Map

我想将一个对象放在 serde_json::Map 中,其中键是该对象内部的值。

use serde_json::{json, Map, Value};

fn main() {
    let a = json!({
        "x": "y"
    });
    
    let mut d: Map<String, Value> = Map::new();
    d[&a["x"].to_string()] = a;
}

错误:

borrow of moved value: `a`
value borrowed here after moverustcE0382
main.rs(9, 30): value moved here
main.rs(4, 9): move occurs because `a` has type `Value`, which does not implement the `Copy` trait

即使您解决了这个生命周期问题,MapIndexMut 实现也不能用于将新元素插入地图。如果给定的密钥不存在,它会出现恐慌。

改用insert()方法,它解决了两个问题:

d.insert(a["x"].to_string(), a);

既然已经回答了正确的解决方案,我将对此进行另一种观点,

d[&a["x"].to_string()] = a;

即使在没有针对传递的索引的条目时提到的位出现恐慌,它真正的意思是,给我索引 x 处的值并将其替换为 a= 在这里调用 Copy,因为 a 没有实现 Copy 特性,编译器给你错误。

在下面的例子中,a 只是被移动,所以没有 Copy 被调用。

d.insert(a["x"].to_string(), a);

此外,在您的情况下,等效项可能是 get 或 insert。

let entry = d.entry(a["x"].to_string()).or_insert(a);

要访问条目中的值,只需将其取消引用为 *entry