HashMap в ошибке Struct: невозможно заимствовать данные в ссылке «&» как изменяемые - PullRequest
0 голосов
/ 17 октября 2019

У меня есть следующий код:

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 part: не может заимствовать данные в ссылке "&" как изменяемые

Итак, я понимаю, что функция 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.

Пожалуйста, дайте мне знать, как решить исходную проблему или как добавить соответствующее время жизни.

1 Ответ

1 голос
/ 17 октября 2019

Проблема в том, что 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');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...