`* arg0` no vive lo suficiente - wasm_bindgen

Aug 29 2020

Al ejecutar el siguiente código:

Cargo.toml

[lib]
crate-type = ["cdylib"]

[dependencies]
serde = { version = "1.0", features = ["derive"] }
wasm-bindgen = {version = "0.2.67", features = ["serde-serialize"] }
wasm-bindgen-futures = "0.4.17"

lib.rs

use serde::{Deserialize, Serialize};
use wasm_bindgen::prelude::*;

#[derive(Serialize, Deserialize)]
struct Output {
    strings: Vec<String>,
}

#[wasm_bindgen] //error occuring here
pub async fn return_strings(_input: &str) -> JsValue {
    
    //example function that returns a js value
    let strings: Vec<String> = Default::default();
    let output = Output { strings };
    
    JsValue::from_serde(&output).unwrap()
}

Obtuve el siguiente error:

*arg0no vive lo suficiente
valor prestado no vive lo suficiente el argumento requiere que *arg0se preste para 'static

Si alguien pudiera decirme por qué, sería de gran ayuda.

Respuestas

1 matthew-mcallister Aug 30 2020 at 15:08

El mensaje de error se produce cuando Rust asume que el futuro devuelto por return_stringstiene la misma vida útil que _inputaunque en realidad no lo toma prestado. Básicamente, la firma de la función sin azúcar se ve así:

pub fn return_strings<'a>(_input: &'a str) -> impl Future<Output = JsValue> + 'a;

El código generado quiere un futuro con 'staticvida útil, pero el futuro devuelto en realidad termina con la vida útil de una variable de cadena temporal.

Los desarrolladores son conscientes de esta limitación . Probablemente la solución más fácil sea tomar un argumento propio Stringo Box<str>en lugar de un préstamo &str.