在 lua table 中可以访问对应的key 得到 value 但无法对两个 table 进行操作lua 提供了 元表(Metatable),允许改变table 的行为 每个行为关联了对应的元方法 setmetatable(table,metatable):对指定 table 设置元表 如果元表中存在_metatable 键值setmetatable会失败 getmetatable(table):返回对象的元表(metatable) mytable = {} myMetatable = {} setmetatable(mytable,myMetatable) ‐‐‐‐‐‐‐‐‐‐‐or‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ mytable = setmetatable({},{}) getmetatable(mytable) ‐‐ 返回 mymetable _index 元方法 这是 metatable 中 最常用的键 当你通过键 来访问 table 的时候 如果这个键没有值 那么 lua 会寻找该 table 的 metatable 中的_index键 . 如果_index包含一个 table , lua 会在表格中查找相 应的键 other = {foo = 3} t = setmetatable({},{_index = othre}) t.foo 如果 _index 包含一个个函数,lua 就会调用该函数,table和键 作为参数传递给函 数 _index 元方法查看元素是否存在 不存在则返回 nil 存在则由 _index返回结果1 mytable = setmetatable({key1 = "value"},{ _index = function(mytable,key) if key == "key2" then return "metatablevalue" else return nil end end }) print(mytable.key1,mytable.key2) ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐or‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ mytable = setmetatable({key1 = "value1"},{_index = {key2 = "metatablevalue"}}) lua 查找一个表元素的规则 __newindex 元方法 __newindex 用来对表更新 ,__index 用来对表访问 当 给 table 的一个缺少的索引赋值 解释器就会查找 __newindex 元方法 如果 存在则调用函数而不进行赋值操作 mytable = {} mytable = setmetatable({key1 = "val1"},{__newindex = mymetatable }) print(mytable.key1) mytable.newkey = "新值2" print(mytable.newkey,mymetatable.newkey) mytable.key1 = "新值1" print(mytable.key1,mymetatable.key1) 在 table 中设置 元方法 __newindex 在对新索引键 赋值时 会调用 元方法 而不 进行赋值 对 table 中已经存在的索引键 则进行赋值 而不调用 元方法 myTable = setmetatable({key1 = "value1"},{ __newindex = function(myTable,key,val) rawset(myTable,key,'"\"'..val..'"\"') end}) myTable.key1 = "new value" myTable.key2 = 4 print(myTable.key1,myTable.key2)