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
forget
mé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
/RefCell
para soltar oClosure
interior 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
cb
aqui, 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 .forget
com 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?