Я пишу структуру данных Trie в Rust для реализации алгоритма Aho-Corasick.Структура TrieNode
представляет узел и выглядит следующим образом:
use std::collections::{HashMap, HashSet, VecDeque};
struct TrieNode {
next_ids: HashMap<char, usize>,
kw_indices: HashSet<usize>,
fail_id: Option<usize>,
}
Я использую ту же стратегию, что и арена поколений, для реализации дерева, где все узлы хранятся в одном Vec
и ссылаются на каждыйдругие используют свои индексы.При создании автомата после создания всех узлов я пытаюсь заставить работать следующий код без использования метода clone()
:
fn build_ac_automaton(nodes: &mut Vec<TrieNode>) {
let mut q = VecDeque::new();
for &i in nodes[0].next_ids.values() {
q.push_back(i);
nodes[i].fail_id = Some(0);
}
// ...
}
, но средство проверки заимствований не очень этому рада:
error[E0502]: cannot borrow `*nodes` as mutable because it is also borrowed as immutable
|
| for &i in nodes[0].next_ids.values() {
| ----- - immutable borrow ends here
| |
| immutable borrow occurs here
| q.push_back(i);
| nodes[i].fail_id = Some(0);
| ^^^^^ mutable borrow occurs here
Как еще можно (если таковые имеются) достичь вышеуказанного без использования дорогостоящего метода clone()
?