我想扩展Lua,以便当用户编写脚本时,变量已经可供他使用。此变量应该是自定义类的实例。
为此,我在运行脚本之前在Lua堆栈上执行lua_newuserdata
和lua_setglobal( L, "variableName" );
。
他们的问题是它崩溃了,所以我不确定它是否崩溃,因为我试图在运行脚本之前创建对象实例,或者因为我在其他地方有另一个错误。
是否允许在运行LUA脚本之前创建对象实例?如果没有,我还有什么其他方法来创建一个最初存在于全局变量中的变量,而用户无需做任何事情来进行检索?
谢谢。
答案 0 :(得分:1)
我想扩展Lua,以便当用户编写脚本时,变量已经可供他使用。
这当然是可能的。一旦Lua状态存在,您就可以创建全局变量(即将键/值对放在全局环境表中)。
是否允许在运行LUA脚本之前创建对象实例?
是的。在我的代码中,我预加载了各种各样的东西。最终用户的有用的东西表。他们可以打电话的额外图书馆。
示例代码:
typedef struct { const char* key; int val; } flags_pair;
...
static flags_pair trigger_flags[] =
{
{ "Enabled", 1 }, // enable trigger
{ "OmitFromLog", 2 }, // omit from log file
{ "OmitFromOutput", 4 }, // omit trigger from output
{ "KeepEvaluating", 8 }, // keep evaluating
{ "IgnoreCase", 16 }, // ignore case when matching
{ "RegularExpression", 32 }, // trigger uses regular expression
{ "ExpandVariables", 512 }, // expand variables like @direction
{ "Replace", 1024 }, // replace existing trigger of same name
{ "LowercaseWildcard", 2048 }, // wildcards forced to lower-case
{ "Temporary", 16384 }, // temporary - do not save to world file
{ "OneShot", 32768 }, // if set, trigger only fires once
{ NULL, 0 }
};
...
static int MakeFlagsTable (lua_State *L,
const char *name,
const flags_pair *arr)
{
const flags_pair *p;
lua_newtable(L);
for(p=arr; p->key != NULL; p++) {
lua_pushstring(L, p->key);
lua_pushnumber(L, p->val);
lua_rawset(L, -3);
}
lua_setglobal (L, name);
return 1;
}
...
MakeFlagsTable (L, "trigger_flag", trigger_flags)