Lua - C API - 在运行之前创建变量

时间:2016-02-10 10:28:52

标签: c lua

我想扩展Lua,以便当用户编写脚本时,变量已经可供他使用。此变量应该是自定义类的实例。

为此,我在运行脚本之前在Lua堆栈上执行lua_newuserdatalua_setglobal( L, "variableName" );

他们的问题是它崩溃了,所以我不确定它是否崩溃,因为我试图在运行脚本之前创建对象实例,或者因为我在其他地方有另一个错误。

是否允许在运行LUA脚本之前创建对象实例?如果没有,我还有什么其他方法来创建一个最初存在于全局变量中的变量,而用户无需做任何事情来进行检索?

谢谢。

1 个答案:

答案 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)