繁体   English   中英

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

[英]Rust: access mutable argument in “while let”

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

问题不在于您的BTreeMap ,而在于您的Node的生命周期。 您正在方法build_string中创建一个节点并尝试将对其的引用插入到地图中。 但是,一旦build_string方法超出范围,本地insert_node就会被删除,但引用仍然存在于树中。 这是不允许的。

因此,您可以将BTreeMap更改为具有Node而不是&Node 然后,您只需将insert_node插入树中,该树将获得该节点的所有权,从而避免任何引用泄漏

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM