`* arg0` não vive o suficiente - wasm_bindgen

Aug 29 2020

Ao executar o seguinte 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()
}

Eu obtenho o seguinte erro:

*arg0não vive o suficiente o
valor emprestado não vive o suficiente o suficiente requer que *arg0seja emprestado para 'static

Se alguém pudesse me dizer o motivo, eu seria uma grande ajuda.

Respostas

1 matthew-mcallister Aug 30 2020 at 15:08

A mensagem de erro é gerada quando Rust assume que o futuro retornado por return_stringstem o mesmo tempo de vida, _inputembora não seja realmente emprestado dele. Basicamente, a assinatura da função sem açúcar se parece com:

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

O código gerado deseja um futuro com 'staticvida útil, mas o futuro retornado na verdade termina com a vida útil de uma variável de string temporária.

Os desenvolvedores estão cientes dessa limitação . Provavelmente, a solução mais fácil é pegar uma propriedade Stringou Box<str>argumento em vez de um emprestado &str.