我正试着用Mlua把Lua植入Rust.使用它的guided tour,我成功地加载并判断了一段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)
    }
}

因为脚本可以返回任何东西,所以我认为特性锁定的泛型注释可以解决这个问题:问题是:

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确实建议添加一个静态的生命周期注释,但对它进行一些研究后,我会try 在不首先使用它的情况下解决这个问题,因为在99%的情况下,你实际上可以不使用它.

推荐答案

不幸的是,在这种情况下,似乎真的需要'static个.

Lua::load()&'lua self,返回Chunk<'lua, '_>.Chunk::<'lua, '_>::eval::<R>()需要R: FromLuaMulti<'lua>.FromLuaMulti<'lua>implemented for T: FromLua<'lua>.FromLua<'lua> is implemented for T: UserData,但它需要T: 'static(也需要T: Clone,但这无关紧要).

Rust相关问答推荐

预期 struct VecDeque Student发现 struct VecDeque Student(Student)

SQL x中的mut *transaction和mut transaction有什么区别?

如何初始化match声明中的两个变量而不会激怒borrow 判断器?

计算具有相邻调换且没有插入或删除的序列的距离

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

rust 迹-内存管理-POP所有权-链表

使用Clap时如何将String作为Into Str参数传递?

铁 rust 中的共享对象实现特征

Rust编译器似乎被结果类型与anyhow混淆

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

OpenGL 如何同时渲染无纹理的四边形和有纹理的四边形

在1.5n次比较中找到整数向量中的最大和次大整数

Rust中如何实现一个与Sized相反的负特性(Unsized)

max(ctz(x), ctz(y)) 有更快的算法吗?

push 方法是否取得所有权?

强制特征仅在 Rust 中的给定类型大小上实现

If let expression within .iter().any

判断 is_ok 后重用结果

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

A 有一个函数,它在 Option<> 类型中时无法编译,但在 Option<> 类型之外会自行编译.为什么?