腾讯wordpress 建站教程,湘潭网站seo磐石网络,做网站编辑好吗,现代简约装修针对在两种正常状态#xff1a;表的不存在的域的查询和修改#xff0c;Lua也提供了改变 tables的行为的方法。
index metamethod
我们可以通过index元方法来实现访问table内部不存在的域时人为操控返回数据。
比如以下测试代码#xff1a;
local set {1,2,3}
setmetata…针对在两种正常状态表的不存在的域的查询和修改Lua也提供了改变 tables的行为的方法。
index metamethod
我们可以通过index元方法来实现访问table内部不存在的域时人为操控返回数据。
比如以下测试代码
local set {1,2,3}
setmetatable(set,{__index function (t, k)print(index func ..k)end
})
print(set[4]) --index func 4 nilset {}
print(set[4]) --nil
由上可以看出当我们去访问表内不存在的域时会走一遍__index函数并取得相应返回值。同时我们需要注意的是在后期重新赋值整表的时候其metatable已经刷新所以再次访问不存在的域时已不存在之前的效果。
__index同样可以是一个table类型而非函数类型这样的意义即如若访问不存在的域则寻找这个table B否则则查找这个table B的__index metamethod。
local A {1,2,3}
local B {[a] 4,[b] 5}
setmetatable(B,{__index function (t,k)print(test B index func)end
})
setmetatable(A,{__index B
})
print(A[a]) --4
print(A[b]) --5
print(A[c]) --test B index func
因此则可以引出lua的重要概念继承通过index函数可以实现没找到原table的域时可以从父类寻找。
如若不想经过index操作则直接调用rawget(t,i)来寻找相应值。
newindex metamethod
__newindex metamethod在对表缺少的域赋值的时候会被调用注意调用了__newindex之后并不会自动进行赋值操作意味着在newindex函数里需要手动赋值才行。参考如下代码
local A {1,2,3}
setmetatable(A,{__newindex function (t, k, v)print(test A newindex func)end
})
A[4] 4 --test A newindex func
for i 1,4 doprint(A[i]) -- 1 2 3 nil
end
可以发现赋值了key4之后的A[4]访问值依然为nil说明newindex内部仍然需要显式加上t[k] v才可。
如若不想经过newindex操作则直接调用rawset(t,k,v)来进行表的赋值。
默认值的表
直接重写index函数如若访问到了不存在的域则默认返回某值即可参考如下代码
local A {1,2,3}
setmetatable(A,{__index function (t, k)return 1end
})
for i 1,4 doprint(A[i]) -- 1 2 3 1
end
当然如果担心每个对象都需要默认值访问逻辑但是默认值都不同也可以表内部维护一个local table变量__index实际上就是调用这个local变量里的某个键值对即可如下所示
local A {1,2,3}
local key {}
setmetatable(A,{__index function (t, k)return A[key]end
})A[key] 1 --如果后续每个对象都需要不同的默认值则直接修改即可不用担心冲突
for i 1,4 doprint(A[i]) -- 1 2 3 1
end
监控表
顾名思义当我们对某个表进行赋值或者访问操作时需要进行记录。我们可以创建一个代理表这个代理表不存储任何数据修改__index和__newindex函数来输出记录并定位至原表如下所示
local A {1,2,3}
function Record(tb)local proxy {}setmetatable(proxy,{__index function (t, k)print(index)return tb[k]end,__newindex function (t, k, v)print(newindex)tb[k] vend})return proxy
endlocal proxy Record(A)
for i 1,3 doprint(proxy[i])
--[[index1index2index3]]--
end
proxy[4] 4 --newindex
只不过类似pairs的操作是无效的因为proxy本身就是空表。
只读表
参考之前的博客lua只读表-CSDN博客