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());
}
_=>恐慌!(“非对象”)
}
}
节点
}