但是例如在下面的代码中,我想在每个循环中将一个值插入一个可变的BTreeMap / Hashmap中,我的简单解决方案触发了一个错误,在Rust中做到这一点的优雅方法是什么?
是否需要在每个循环开始时克隆BTreeMap
?
pub fn build_string(word: &str, trie: &mut BTreeMap<&str, &Node>, word_index: usize) {
for char in word.chars() {
let char_label = char.to_string();
let insert_node = Node::new(&char_label, word_index);
let insert_result = trie.insert(&char_label, &insert_node);
println!("char: {}, at index", char);
}
}
错误是
error[E0597]: `insert_node` does not live long enough
--> src/lib.rs:69:54
|
65 | pub fn build_string(word: &str, trie: &mut BTreeMap<&str, &Node>, word_index: usize) {
| - let's call the lifetime of this reference `'1`
...
69 | let insert_result = trie.insert(&char_label, &insert_node);
| -------------------------^^^^^^^^^^^^-
| | |
| | borrowed value does not live long enough
| argument requires that `insert_node` is borrowed for `'1`
70 | println!("char: {}, at index", char);
71 | }
| - `insert_node` dropped here while still borrowed
答案 0 :(得分:3)
问题与您的BTreeMap
无关,而与Node
的生存期有关。您正在方法build_string
内创建一个节点,并尝试将对其的引用插入到映射中。但是,一旦方法build_string
超出范围,则本地insert_node
将被删除,但引用仍将存在于树中。这是不允许的。
因此,您可以将BTreeMap
的值改为Node
而不是&Node
。然后,您只需将insert_node
插入到树中即可,该树将获得该节点的所有权,从而避免了任何参考泄漏