Невозможно выполнить рекурсию вниз по дереву с помощью RwLock и HashMap - PullRequest
0 голосов
/ 28 мая 2020

У меня есть древовидная структура, которая использует HashMap в RwLock для представления дочерних узлов узла, но мой метод рекурсии вниз по дереву для вставки значения, похоже, вызывает проблему с временем жизни. Более полный образец можно найти здесь , но соответствующий код таков:

struct Node<'a> {
    data: i32,
    children: RwLock<HashMap<String, Node<'a>>>,
    parent: Option<&'a Node<'a>> //necessary, as I need to be able to recurse back up the tree
}

impl<'a> Node<'a> {
    fn add_sequence(&'a self, key_list: Vec<String>, data: i32) {
        let mut key_iter = key_list.iter();
        let mut curr = self;

        let last = loop {
            let next = key_iter.next();
            if let None = next {return;}

            let key = next.unwrap();
            if curr.children.read().unwrap().contains_key(key) {
                curr = curr.children.read().as_ref().unwrap().get(key).unwrap();
            } else {
                break next.unwrap();
            }
        };
        curr.add_child(last.to_string(), data);
    }
}

Это дает мне следующую ошибку:

  --> src/main.rs:22:24
   |
11 | impl<'a> Node<'a> {
   |      -- lifetime `'a` defined here
...
22 |                 curr = curr.children.read().as_ref().unwrap().get(key).unwrap();
   |                        ^^^^^^^^^^^^^^^^^^^^---------                           - temporary value is freed at the end of this statement
   |                        |
   |                        creates a temporary which is freed while still in use
   |                        argument requires that borrow lasts for `'a`

Я пробовал решения, подобные описанному в этом ответе , но мне не удалось заставить его работать, возможно, из-за того, что процесс является итеративным, а не разовым. Как исправить эту ошибку?

...