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
,但这无关紧要)。
我正在尝试使用 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
,但这无关紧要)。