Al proporcionar devoluciones de llamada a JavaScript usando Closures , ¿cuál es una mejor manera de lidiar con evitar liberarlos? La guía wasm-bindgen sugiere usar .forget
, pero admite que eso es esencialmente una pérdida de memoria.
Normalmente, almacenaríamos el identificador para luego descartarlo en el momento adecuado, pero por ahora queremos que sea un controlador global, por lo que utilizamos el
forget
método para descartarlo sin invalidar el cierre. Tenga en cuenta que esto está perdiendo memoria en Rust, ¡así que esto debe hacerse con prudencia!
Sugiere almacenar el cierre hasta el momento en que sea apropiado dejarlo caer. En la respuesta de alexcrichton a una pregunta anterior , menciona ...
[...] si se invoca [...] solo una vez, entonces puede usar
Rc
/RefCell
para soltar elClosure
interior del cierre (usando algunas travesuras de mutabilidad interior)
Pero él no proporciona un ejemplo de este método.
La documentación de cierre también da un ejemplo de devolver la referencia al cierre al contexto de JavaScript para permitirle manejar cuándo liberar la referencia.
Si tuviéramos que dejarlo
cb
aquí, provocaría una excepción cada vez que transcurriera el intervalo. En cambio, devolvemos nuestro identificador a JS para que JS pueda decidir cuándo cancelar el intervalo y desasignar el cierre.
También me imagino que hay formas de usar características como vidas o la #[wasm_bindgen]
macro en una función pública para evitar este problema también, pero tengo problemas para descubrir cómo hacerlo de esa manera.
Mi pregunta es, ¿cuáles son las alternativas al uso .forget
con cierres que se están transfiriendo a JavaScript desde Rust, y puedo ver algunos ejemplos simples de cada opción en uso?
fuente