1:元表与元方法
a={name = "a name" , age = "a age 18"} b={}
setmetatable(b,a)
测试001:
print(a.age) ----> a age 18
print(b.age) ----> nil
测试002:
a.__index = a
print(a.age) ----> a age 18
print(b.age) ----> a age 18
测试003-1:
a.orz = 99
b.orz = 100
print(b.orz) ----> 100
测试003-2:
a.orz = 99
a.__newindex = function () print("a new index") end
b.orz = 100
print(b.orz) -----> 99 (A:b在给字段orz赋值的时候,会调元表里面的元方法__newindex,调完之后b.orz并没有赋值,打印b.orz的时候,发现没有值,去访问元表中的元方法__index,---> 99 )
当设置一个 table key的value值时,先访问table的元表中的元方法__newindex,(如果table的元表里面重新定义了__newindex,将会调用元表中的元方法__newindex)
总结:__index 和 __newindex 都是在table中没有所需访问的Index时才发挥作用。
2: 具有默认值的table
其实就是设置了 table 的元表,在元表里面重写元方法 __index ,这个方法返回一个 固定的值,比如 0 或者 1
3:只读的table
function readonly(t)
table proxy = {}
table mt = {
_index = t
_newindex = function (t,k,v)
print("只读table,无法写入")
end
}
setmetatable(proxy,mt)
return proxy
end
===========================================
用上述的方法返回一个只读的table ( readonly({创建一个Table构造式}))