Lua使用Get/Set Metatable实现表索引默认返回localplayer字段问题
问题核心原因
- 你代码中
getmetatable(tbl.localplayer)返回值为nil,普通Lua表默认没有绑定元表,所以你设置元表的操作完全未生效 - 没有定义索引访问的 fallback 逻辑,直接用下标访问返回的
tbl时,只会在tbl自身的键中查找,找不到就返回nil,不会自动去localplayer字段中查询
修改后代码
local ents = { GetLocalPlayer = function() local tbl = { localplayer = {"Ava", "1", {213,234,234}}, GetIndex = function(self) return self.localplayer[2] end, } -- 手动设置带__index元方法的元表 setmetatable(tbl, { __index = function(self, key) -- 优先返回tbl自身存在的字段(比如自定义方法) if rawget(self, key) ~= nil then return rawget(self, key) end -- 自身没有的键,自动去localplayer中查找 return self.localplayer[key] end }) return tbl end } local function main() print(ents.GetLocalPlayer()[2]) -- 输出1 print(ents.GetLocalPlayer():GetIndex()) -- 输出1 print(ents.GetLocalPlayer()[1]) -- 输出Ava end
逻辑说明
- 自定义元表的
__index元方法会在你访问表中不存在的键时自动触发 - 用
rawget优先读取表自身的字段,保证GetIndex这类自定义方法可以正常调用 - 自身不存在的键全部转发到
localplayer表查询,满足直接用下标访问取值的需求
内容的提问来源于stack exchange,提问作者Carter
相关产品推荐
相关产品推荐

