设置为 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
即使您解决了这个生命周期问题,Map
的 IndexMut
实现也不能用于将新元素插入地图。如果给定的密钥不存在,它会出现恐慌。
改用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
我想将一个对象放在 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
即使您解决了这个生命周期问题,Map
的 IndexMut
实现也不能用于将新元素插入地图。如果给定的密钥不存在,它会出现恐慌。
改用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