HashMap中出现Struct错误:无法借用“&”引用中的可变数据

时间:2019-10-17 02:42:37

标签: rust

我有以下代码:

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');,但仍然会引发错误。
  • 我遵循了另一个答案here,并试图使node_map易变,例如:
 struct Node<'a> {
     node_map: &'a mut HashMap<char, Node<'a>>,
     value: Option<i32>,
 }

但是后来我抱怨缺少一生。我不知道如何添加的一个特定地方是new函数。

请让我知道如何解决原始问题或如何增加适当的寿命。

1 个答案:

答案 0 :(得分:1)

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

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

(我将key的参数更改为&str,因为it's discouraged to take &String as an argument

另一种风格上的东西:您应该使用if let而不是检查search_node是否存在然后再展开。

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