Forçando a ordem na qual os campos struct são descartados
Estou implementando um objeto que possui vários recursos criados a partir de bibliotecas C através do FFI. Para limpar o que já foi feito se o construtor entrar em pânico, estou agrupando cada recurso em sua própria estrutura e implementandoDrop
para eles. No entanto, quando se trata de descartar o próprio objeto, não posso garantir que os recursos sejam descartados em uma ordem segura porque o Rust não define a ordem em que os campos de uma estrutura são descartados.
Normalmente, você resolveria isso fazendo com que o objeto não possuísse os recursos, mas os emprestaria (para que os recursos pudessem se emprestar). De fato, isso leva o problema ao código de chamada, onde a ordem de recebimento é bem definida e aplicada com a semântica do empréstimo. Mas isso é inapropriado para o meu caso de uso e, em geral, é um pouco difícil.
O que é irritante é que isso seria incrivelmente fácil sedrop
tomouself
ao invés de&mut self
por algum motivo. Então eu poderia simplesmente ligarstd::mem::drop
na minha ordem desejada.
Há alguma maneira de fazer isso? Se não, existe alguma maneira de limpar no caso de pânico no construtor sem capturar e revitalizar manualmente?