为luaL_newmetatable

时间:2017-08-31 14:53:45

标签: lua

我正在编写一个Lua库,它使用luaL_newmetatable()注册一些元表。由于其他库也可以这样做,我想问一下什么是避免使用两次相同名称的好策略。我正在考虑使用像com.mydomain.mylibrary这样的反向DNS名称,我猜这应该是非常安全的。但是,我想问一下是否有更好或更标准的方法可以使用luaL_newmetatable()选择库的唯一名称。

2 个答案:

答案 0 :(得分:2)

我喜欢使用lightuserdata和指向字符串的指针。

#define LCURL_EASY_NAME LCURL_PREFIX" Easy"
static const char *LCURL_EASY = LCURL_EASY_NAME;

只需要简单的功能就可以使用它。

int lutil_newmetatablep (lua_State *L, const void *p) {
  lua_rawgetp(L, LUA_REGISTRYINDEX, p);
  if (!lua_isnil(L, -1))
    return 0;
  lua_pop(L, 1);

  lua_newtable(L);  /* create metatable */
  lua_pushvalue(L, -1); /* duplicate metatable to set*/
  lua_rawsetp(L, LUA_REGISTRYINDEX, p);

  return 1;
}

类似于get / set。结帐,例如我的Lua-cURL图书馆。

答案 1 :(得分:0)

我会使用一个字符串来描述"对象"因为这个字符串最终在Lua错误消息中输出:

e.g。如果metatable被命名为"数据库连接":

stdin:1:不好参数#1到'状态' (期望数据库连接,没有价值)

如果您使用UUID,则没有人能理解输出。