Oleg Pittman
Oleg Pittman

Reputation: 61

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

I'm trying to imbed Lua into Rust using Mlua. Using its guided tour, I successfully loaded and evaluated a chunk of Lua code. My next goal is to combine this with opening a file and reading its contents. This is where things get problematic:

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

Since scripts can return literally anything, I thought a trait-locked generic annotation would solve the issue: The problem is this:

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

For reference, here is the function signature as defined in lua.rs:

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

I don't understand why I'm having this issue. I've looked this up and this question pertained to user-created types, which to my knowledge I'm not doing... so what is the problem here? It's clear that things like <i32> won't die anytime soon. Cargo did suggest adding a static lifetime annotation, but doing some research into it points me to trying to solve the problem without using it first, since in 99% of cases you actually can get away without it.

Upvotes: 2

Views: 136

Answers (1)

Chayim Friedman
Chayim Friedman

Reputation: 70950

Unfortunately in this case it seems like 'static is really required.

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, however it requires T: 'static (and also T: Clone, but this is irrelevant).

Upvotes: 3

Related Questions