当变量被另一个函数使用时,如何阻止变量在范围末尾被删除?



我试图将一段Lua代码的解析扔到函数中以使其更容易。现在,我有以下代码:

fn load_file<'lua, 'a>(
context: Context<'lua>,
root: &'a str,
project_filename: &'a str,
) -> Chunk<'lua, 'a> {
let path_str = Path::new(root).join(project_filename);
let source = std::fs::read(path_str).expect(&format!(
"Failed to load project file: {}",
project_filename
));
let chunk = context
.load(&source)
.set_name(project_filename)
.expect("Failed to create chunk");
return chunk;
}

source在函数结束时被删除,但是返回的chunk需要它。我不能克隆它,因为它也掉了。如何使引用在函数的生命周期之后仍然有效?

创建Chunk不解析或编译源代码-这就是为什么它借鉴了source,因为它将需要访问这些数据。

如果您想编译块而不运行它(消除对保留源代码的依赖),您可以调用into_function方法。

如果你愿意在编译的同时执行数据块,那么可以使用callevalexec

上面的链接指向rlua的文档,但如果你使用mlua,同样的答案也适用。

最新更新