2017-08-31 36 views
2

我在寫一個使用luaL_newmetatable()註冊了一些元表的Lua庫。由於其他圖書館也可以這樣做,所以我想問一下,避免使用同一個名稱兩次的策略是一個好策略。我正在考慮使用反向DNS名稱,如com.mydomain.mylibrary,我猜這應該是非常安全的。不過,我想問問是否可以使用luaL_newmetatable()爲圖書館選擇唯一名稱的更好或標準方式。爲luaL_newmetatable選擇唯一名稱

+0

使用[GUID](https://www.guidgenerator.com/online-guid-generator.aspx),只要你需要唯一的字符串(雖然不是人類可讀) –

回答

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庫。

+0

爲什麼不使用指向字節的指針(保留但未初始化大小爲1字節的變量)來節省內存?除了創建一個輕量級用戶數據之外,您是否將這個字符串指針用於其他目的?例如,你用這個字符串來識別嗎? –

0

我會用它描述的是在「對象」,因爲這串是最終的Lua錯誤信息輸出的字符串:

例如如果元表被命名爲「數據庫連接」:

標準輸入:1:壞參數#1「狀態」(數據庫連接料,有沒有價值)

如果使用UUID,沒有人能看得懂輸出。

+0

以及如何避免metatable名稱衝突?其他開發人員可能會爲他自己的metatable使用相同的單詞。這是OP所問的。 –

+0

我還沒有嘗試過,但可能會使用帶有嵌入式NUL字符的字符串:「數據庫連接\ 0x00 」。我猜錯誤信息將只包含字節,直到NUL字符 –

+0

我剛剛嘗試過,它實際上工作。只是不確定字符串是否在創建metatable時或輸出發生時被剝離... –