结构中的哈希映射错误:无法借用"&"引用中的数据作为可变



我有以下代码:

struct Node{
node_map: HashMap<char, Node>,
value: Option<i32>,
}
struct Trie {
root: Node,
}
impl Trie {
fn new() -> Trie {
Trie {
root: Node{
node_map: HashMap::new(),
value: None,
},
}
}
fn find(&self, key: &String) -> Option<&Node> {
// Returning some Option<&Node>
}
fn delete(&mut self, key: &String) -> Option<i32> {
// extract code snippet
let mut search_node = self.find(key);
if search_node.is_some() {
search_node.unwrap().node_map.remove(& 'x');
}
None
}
}

Rust 抱怨search_node.unwrap().chs部分的错误:不能借用"&"引用中的数据作为可变的

所以我知道find函数返回Option<&Node>所以当在上面行解包时,我得到了对Node的引用。

尝试次数:

  • 我试图通过以下方式取消引用节点:*search_node.unwrap().node_map.remove(& 'x');*(search_node.unwrap()).node_map.remove(& 'x');但它仍然抛出错误。
  • 我在这里遵循了另一个答案,并试图使node_map可变,如下所示:
struct Node<'a> {
node_map: &'a mut HashMap<char, Node<'a>>,
value: Option<i32>,
}

但后来我抱怨缺乏寿命的几个地方。我不知道如何添加的一个特定位置是new功能。

请让我知道如何解决原始问题或如何添加适当的生命周期。

问题是find返回一个(可选的(不可变引用,但稍后您尝试对其进行更改。因此,您可能希望添加带有签名的方法find_mut

fn find_mut(&mut self, key: &str) -> Option<&mut Node>

(我将key参数更改为&str,因为不鼓励将&String作为参数(

另一个风格:你应该使用if let而不是检查search_node是一些然后解开包装。

if let Some(search_node) = self.find_mut(key) {
search_node.node_map.remove(&'x');
}

最新更新