Lua初学习 9-13_03 元表与元方法

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构造式}))