Ao fornecer retornos de chamada para JavaScript usando Closures , qual é a melhor maneira de lidar com evitar liberá-los? O guia wasm-bindgen sugere o uso .forget, mas admite que isso é essencialmente vazamento de memória.
Normalmente, armazenaríamos o identificador para depois ser descartado no momento apropriado, mas, por enquanto, queremos que seja um manipulador global; portanto, usamos o
forgetmétodo para descartá-lo sem invalidar o fechamento. Observe que isso está vazando memória no Rust, portanto, isso deve ser feito criteriosamente!
Ele sugere armazenar o fechamento até um momento em que é apropriado que ele seja descartado. Na resposta de alexcrichton a uma pergunta anterior , ele menciona ...
[...] se for invocado apenas uma vez, você poderá usar
Rc/RefCellpara soltar oClosureinterior do próprio fechamento (usando algumas travessuras internas de mutabilidade)
Mas ele não fornece um exemplo desse método.
A documentação de fechamento também fornece um exemplo de retorno da referência ao fechamento para o contexto JavaScript para permitir que ele lide quando liberar a referência.
Se cairmos
cbaqui, uma exceção será levantada sempre que o intervalo transcorrer. Em vez disso, retornamos nosso identificador de volta para JS para que ele possa decidir quando cancelar o intervalo e desalocar o fechamento.
Eu também imagino que existem maneiras de usar recursos como vidas úteis ou o #[wasm_bindgen] macro em uma função pública para evitar esse problema também, mas estou tendo problemas para descobrir como fazê-lo dessa maneira.
Minha pergunta é: quais são as alternativas ao uso .forgetcom fechamentos que estão sendo passados de volta para o JavaScript a partir do Rust, e posso ver alguns exemplos simples de cada opção em uso?