如何从 rbtree-rs 插入或更新 RBTree?

How do I insert into or update an RBTree from rbtree-rs?

如果值是数据结构的一部分(在本例中为红黑树),我无法理解如何以惯用方式查找和追加或创建新向量。

我正在使用 this Red Black Tree implementation 并且计划获取对值的可变引用,如果它存在(不是 None)我将附加到该值并创建一个新向量并移动它如果键没有值,则为 RBTree。我的代码看起来像这样,为简洁起见稍作改动,请原谅任何粗心的错误:

struct Obj {
    tree: RBTree<i32, Vec<String>>,
}

let mut obj = Obj {
    tree: RBTree::new(),
};

let k = 5;
let v = "whatever";

match obj.tree.get_mut(k) {
    None => {
        let mut vec: Vec<Node> = Vec::new();
        vec.push(v);
        book.tree.insert(k, vec);
    }
    Some(vec) => vec.push(v),
}

问题是当我检查树是否存在时,我得到了一个对树的可变引用,因为如果它确实存在,我想通过附加到向量来改变它。但是,如果它不存在,我想插入一个尝试进行可变借用的新节点,所以我在这一行 book.tree.insert(k, vec);.

上得到一个 "second mutable borrow occurs here"

我很想深入了解如何执行此查找或创建,以便它可以编译并且是线程安全的。我猜也可能是我使用的库有问题。还没有资格对此发表评论。

在这种情况下,解决方法是将变异代码移出 get_mut() 的范围。

let needs_insert = match obj.tree.get_mut(k) {
    None => true,
    Some(vec) => {
        vec.push(v); 
        false
    }
};

if needs_insert {
    book.tree.insert(k, vec![v]);
}