Rust 迭代地获取子节点的可变引用

Rust 迭代地获取子节点的可变引用,rust,mutable,Rust,Mutable,我需要一个类似的函数,我想确认某个子节点是否存在,如果存在,获取其可变引用,如果不存在,创建并获取该引用 我遇到了一些困难,我的父节点是一个可变引用,而子节点也是一个可变引用,所以父节点的引用应该被释放,但是编译器告诉我“不能给不可变变量赋值两次”,这让我很困惑 以下是我的尝试,我如何解决这个问题 使用std::collections::HashMap; 发布枚举JsonValue{ 无效的 布尔(布尔), 编号(f32), 串(串),, 阵列(Vec), 对象(HashMap), } impl

我需要一个类似的函数,我想确认某个子节点是否存在,如果存在,获取其可变引用,如果不存在,创建并获取该引用

我遇到了一些困难,我的父节点是一个可变引用,而子节点也是一个可变引用,所以父节点的引用应该被释放,但是编译器告诉我“不能给不可变变量赋值两次”,这让我很困惑

以下是我的尝试,我如何解决这个问题

使用std::collections::HashMap;
发布枚举JsonValue{
无效的
布尔(布尔),
编号(f32),
串(串),,
阵列(Vec),
对象(HashMap),
}
impljsonvalue{
fn new()->JsonValue{JsonValue::Object(HashMap::new())}
fn检查密钥路径(mut self,路径:&str)->&JsonValue{
设ref mut node=self;
对于路径中的k。拆分(“.”){
匹配节点{
JsonValue::对象(dict)=>{
节点=匹配dict.get(k){
一些(参考mut s)=>s,
None=>&mut dict.insert(k.to_string(),JsonValue::new()).unwrap()
}
}
_=>恐慌!(“非对象”)
}
}
节点
}
}
fn main(){
让mut v=JsonValue::new();
v、 检查密钥路径(“some.node.path”);
}

这里有几个问题:

  • check\u key\u path
    按值获取
    self
    ,这意味着该方法消耗
    self
    。一旦使用了
    self
    ,要从方法返回的
    &JsonValue
    将被删除,因此引用无效
  • let ref mut
    声明对可变引用的不可变绑定,这意味着您可以更改引用的数据,但不能更改绑定引用的数据。这是您在尝试重新分配
    节点时看到的错误
  • 调用
    dict.get(k)
    时,将
    dict
    借用为不可变,然后尝试
    dict.insert()
标准库提供了一个类型
Entry
,可以帮助您完成这类工作:您可以从
HashMap
获取一个值,或者在
Entry::或_insert
不存在时创建它

下面是更新代码的示例,如下所示:

//取&mut self而不是mut self
fn检查键路径(&mut self,路径:&str)->&JsonValue{
//将节点声明为具有值的可变绑定&mut self
让mut节点=self;
对于路径中的k。拆分(“.”){
匹配节点{
JsonValue::对象(dict)=>{
//使用键k获取或创建值
node=dict.entry(k.to_string())或_insert(JsonValue::new());
}
_=>恐慌!(“非对象”)
}
}
节点
}

这里有几个问题:

  • check\u key\u path
    按值获取
    self
    ,这意味着该方法消耗
    self
    。一旦使用了
    self
    ,要从方法返回的
    &JsonValue
    将被删除,因此引用无效
  • let ref mut
    声明对可变引用的不可变绑定,这意味着您可以更改引用的数据,但不能更改绑定引用的数据。这是您在尝试重新分配
    节点时看到的错误
  • 调用
    dict.get(k)
    时,将
    dict
    借用为不可变,然后尝试
    dict.insert()
标准库提供了一个类型
Entry
,可以帮助您完成这类工作:您可以从
HashMap
获取一个值,或者在
Entry::或_insert
不存在时创建它

下面是更新代码的示例,如下所示:

//取&mut self而不是mut self
fn检查键路径(&mut self,路径:&str)->&JsonValue{
//将节点声明为具有值的可变绑定&mut self
让mut节点=self;
对于路径中的k。拆分(“.”){
匹配节点{
JsonValue::对象(dict)=>{
//使用键k获取或创建值
node=dict.entry(k.to_string())或_insert(JsonValue::new());
}
_=>恐慌!(“非对象”)
}
}
节点
}