Rust Generics,“`T` 可能活得不够长”

Rust Generics, "`T` may not live long enough"

我正在尝试使用 Mlua. Using its guided tour 将 Lua 嵌入到 Rust 中,我成功加载并评估了一大块 Lua 代码。我的下一个目标是将其与打开文件和读取其内容相结合。这就是问题所在:

use anyhow::Result;
use mlua::{Lua, UserData};
use std::fs;

pub struct LuaManager {
    lua_state: Lua
}

impl LuaManager {
    pub fn new() -> Self {
        LuaManager {
            lua_state: Lua::new(),
        }
    }

    pub fn eval<T>(&self, chunk: &str) -> Result<T> where T: Clone + UserData {
        let v = self.lua_state.load(chunk).eval::<T>()?;
        Ok(v)
    }
}

因为脚本可以 return 字面上的任何东西,我认为特征锁定的通用注释可以解决这个问题:问题是这样的:

Error generated by rustc: the parameter type `T` may not live long enough... so that the type `T` will meet its required lifetime bounds...

作为参考,这里是 lua.rs 中定义的函数签名:

pub fn eval<R: FromLuaMulti<'lua>>(self) -> Result<R>

我不明白为什么我会遇到这个问题。我查了一下,这个问题与用户创建的类型有关,据我所知我没有这样做……那么这里的问题是什么?很明显,像 <i32> 这样的东西不会很快消亡。 Cargo 确实建议添加一个静态生命周期注释,但对它进行一些研究表明我试图在不首先使用它的情况下解决问题,因为在 99% 的情况下,你实际上可以在没有它的情况下逃脱。

不幸的是,在这种情况下似乎确实需要 'static

Lua::load() takes &'lua self and returns Chunk<'lua, '_>. Chunk::<'lua, '_>::eval::<R>() requires R: FromLuaMulti<'lua>. FromLuaMulti<'lua> is implemented for T: FromLua<'lua>. FromLua<'lua> is implemented for T: UserData,但它需要 T: 'static(以及 T: Clone,但这无关紧要)。