选择唯一的名称来命名 luaL_newmetatable

我正在编写一个 Lua 库,使用 luaL_newmetatable() 注册一些元表。既然其他库也可能这样做,我想问问,有什么好的策略可以避免使用相同的名称?我正在考虑使用反向 DNS 名称,比如 com.mydomain.mylibrary,这应该是相当安全的。但是,我想问问,是否有更好的或标准的方式来选择使用 luaL_newmetatable() 的库的唯一名称?

点赞
用户2328287
用户2328287

我喜欢使用指向字符串的轻量 userdata。

#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);  /* 创建 metatable */
  lua_pushvalue(L, -1); /* 复制 metatable 以进行设置 */
  lua_rawsetp(L, LUA_REGISTRYINDEX, p);

  return 1;
}

获取和设置也类似。查看例如我编写的 Lua-cURL 库。

2017-08-31 15:15:09
用户2420301
用户2420301

我会使用一个字符串来描述“对象”中的内容,因为最终这个字符串会出现在 Lua 的错误信息中:

例如,如果元表的名称为“数据库连接”:

stdin:1: bad argument #1 to 'status' (database connection expected, got no value)

如果使用 UUID,则无法理解输出的内容。

2017-09-01 13:21:13