Então eu tenho o erro acima na linha 17, que eu entendo, mas não encontro uma boa maneira de contornar:
struct Node {
node_type: NodeType
}
enum NodeType {
Inner([Box<Node>; 16]),
Leaf(Vec<usize>)
}
impl Node {
fn foo(&mut self) {
match &mut self.node_type {
NodeType::Leaf(_content) => {
// Mutate content
},
NodeType::Inner(children) => {
let index = self.compute_index();
let child = &mut children[index];
child.foo();
}
}
}
fn compute_index(&self) -> usize {
// compute something
0
}
}
Preciso self
ser mutável, para alterar seu conteúdo no Leaf
caso. Eu poderia copiar o código compute_index()
para minha foo()
função, mas isso tornaria a foo()
função desnecessariamente longa e o código dentro dela compute_index()
pareceria uma unidade semântica separada por si só.
Eu também poderia mover a chamada para compute_index()
cima da match
instrução, mas não preciso executá-la em todos os braços de correspondência, então isso causaria cálculos desnecessários nesse caso e também não parece certo.
Pensei nisso por um bom tempo, mas não consigo descobrir uma maneira de me livrar desse erro sem tornar meu código ruim. Alguém tem idéias sobre como se livrar do erro sem tornar o código ruim?
Você pode embaralhar as coisas para calcular o índice antes de adquirir um empréstimo mutável?