Rust:在“ while let”中访问可变参数

时间:2019-12-28 14:21:35

标签: loops rust

但是例如在下面的代码中,我想在每个循环中将一个值插入一个可变的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

1 个答案:

答案 0 :(得分:3)

问题与您的BTreeMap无关,而与Node的生存期有关。您正在方法build_string内创建一个节点,并尝试将对其的引用插入到映射中。但是,一旦方法build_string超出范围,则本地insert_node将被删除,但引用仍将存在于树中。这是不允许的。

因此,您可以将BTreeMap的值改为Node而不是&Node。然后,您只需将insert_node插入到树中即可,该树将获得该节点的所有权,从而避免了任何参考泄漏