2017-04-11 92 views
1

Lua API有一個函數lua_getmetatable如果值有一個,它將獲取帶有元函數的表。
Lua輔助庫(它是lua API的一部分)具有另一個功能luaL_getmetatable這是一個將從LUA_REGISTRYINDEX中提取值的宏。 但這個庫luaL_getmetafield的另一個功能並不是你期望的 - 它會在get_metatable的位置尋找一個方法。lua_getmetatable和luaL_getmetatable之間的區別是什麼

爲什麼有兩個不同的位置? 何時每個metatable使用?

回答

4

lua_getmetatable獲取與給定對象關聯的元數據。這是一個基本特徵;如果此函數不存在,則無法訪問給定對象的元數據。

luaL_getmetatable是爲userdata(可以從Lua訪問的C對象)或類的類提供類型的約定的一部分。在這個約定中,您使用luaL_newmetatable將表添加到註冊表中,然後使用這些表來表示不同用戶數據/表類型的metatables(當您需要它們時,您可以從註冊表中讀取它們並將它們設置爲luaL_setmetatable)。

這只是一個便利功能;如果你不想要,你不需要遵循這個約定。如果您將元數據表放置在不在註冊表中的某個位置,並且使用lua_setmetatable將它們綁定到您的用戶數據,則所有內容仍然可以工作。也就是說,如果luaL_*metatable函數不存在,那麼您將在哪裏放置用於表示不同用戶數據/表類型的表;當你第二次需要他們時,你會如何再次找到他們?你可以用不同的方式解決這個問題,但爲什麼不使用預先構建的約定,如果它適合你。

相關問題