“*arg0” 存活时间不足 - wasm_bindgen

3
运行以下代码时: 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。
如果有人能告诉我原因,将是巨大的帮助。
1个回答

2
错误消息是由于Rust假设return_strings返回的future与_input具有相同的生命周期,即使它实际上并没有从中借用。基本上,去糖化后的函数签名看起来像这样:
pub fn return_strings<'a>(_input: &'a str) -> impl Future<Output = JsValue> + 'a;

生成的代码需要一个具有“静态”生命周期的 future,但实际返回的 future 最终具有临时字符串变量的生命周期。 开发人员意识到了这个限制。可能最简单的解决方案是使用拥有所有权的 String 或 Box 参数,而不是借用的 &str。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接