* arg0寿命不足-wasm_bindgen

问题描述

运行以下代码时:

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()
}

我收到以下错误

*arg0的寿命不足
借入的价值寿命不足,论点要求为*arg0借入'static

如果有人能让我知道为什么,我将为您提供巨大帮助。

解决方法

当Rust假设return_strings返回的未来与_input具有相同的生存期时,即使实际上并没有从中借用,也会导致错误消息。基本上,已删除功能的签名如下:

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

生成的代码希望有一个'static生存期的未来,但是返回的未来实际上随着临时字符串变量的生存期而结束。

The developers are aware of this limitation。可能最简单的解决方案是采用拥有的StringBox<str>参数而不是借来的&str

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...