在Lua'Pluto库的description中,它表示lib持久存在函数和线程。
Can persist any Lua function
Can persist threads
Works with any Lua chunkreader/chunkwriter
Support for "invariant" permanent objects, of all datatypes
嗯,我无法想象如何保持函数和线程。我可以对此功能有一些解释吗?
答案 0 :(得分:2)
source code相对容易理解并且非常评论。
lib的作用是确定构成函数和/或线程的部分,然后分别存储每个部分。
如果您跳过代码并只阅读注释,以下是两个相关功能的外观:
static void persistfunction(PersistInfo *pi)
{
...
if(cl->c.isC) {
/* It's a C function. For now, we aren't going to allow
* persistence of C closures, even if the "C proto" is
* already in the permanents table. */
lua_pushstring(pi->L, "Attempt to persist a C function");
lua_error(pi->L);
} else { /* It's a Lua closure. */
/* Persist prototype */
...
/* Persist upvalue values (not the upvalue objects themselves) */
...
/* Persist function environment */
...
}
}
static void persistthread(PersistInfo *pi)
{
...
/* Persist the stack */
...
/* Now, persist the CallInfo stack. */
...
/* Serialize the state's other parameters, with the exception of upval stuff */
...
/* Finally, record upvalues which need to be reopened */
...
}
因此,正如您所看到的,函数可以被视为原型,一组upvalues和一个环境(一个表)的组合。一个线程是两个“堆栈”(我认为是调用堆栈和内存堆栈),状态信息(不包括upvalues),它基本上是在定义线程时变量具有哪些值,以及upvalues。
您可以在PiL 27.3.3
中阅读有关upvalues的更多信息答案 1 :(得分:0)