【发布时间】:2020-07-04 11:52:30
【问题描述】:
我需要一个类似assocPath的函数,我想确认某个子节点是否存在,如果存在,获取它的可变引用,如果不存在,创建并获取它。
我遇到了一些困难,我的父节点是可变引用,子节点也是可变引用,所以应该释放父节点的引用,但是编译器告诉我“不能两次赋值给不可变变量”,这让我很困惑。
以下是我的尝试,请问如何解决?
use std::collections::HashMap;
pub enum JsonValue {
Null,
Bool(bool),
Number(f32),
String(String),
Array(Vec<JsonValue>),
Object(HashMap<String, JsonValue>),
}
impl JsonValue {
fn new() -> JsonValue { JsonValue::Object(HashMap::new()) }
fn check_key_path(mut self, path: &str) -> &JsonValue {
let ref mut node = self;
for k in path.split(".") {
match node {
JsonValue::Object(dict) => {
node = match dict.get(k) {
Some(ref mut s) => s,
None => &mut dict.insert(k.to_string(), JsonValue::new()).unwrap()
}
}
_ => panic!("NotObject")
}
}
node
}
}
fn main() {
let mut v = JsonValue::new();
v.check_key_path("some.node.path");
}
【问题讨论】: