gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:42:05 24 4
gpt4 key购买 nike

但是例如在下面的代码中,我想在每个循环中将一个值插入一个可变的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插入树中即可获取该节点的所有权,从而避免任何引用泄漏

关于loops - Rust:在 “while let”中访问可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59511721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com