[英]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.