lua 元表Metatable (六)
元表理解起来比较抽象,但这是lua设置的一种数据结构而已, 假设有table_A、table_B 这2个table,如果table_A要操作table_B,显然是不可能的 因为者都之间是没有关系的,如果把table_B设置成了table_A 的元表,那么table_A就可以操作table_B里面的元素,甚至可以对2个table里面的元 素进行运算操作元表的 设置语法:setmetatable(table_A,table_B) 元表里面有以下元方法: 1.__index --- 该方法主要是用来对表访问。 通过它来设置metatable的键,table通过这个键来获取metatable中的值 2.__newIndex --- 该方法主要是对表更新。 当给一个表中的索引赋值时,解释器就会调用查找__newIndex方法,如果存在则调用进行赋值操作 mytable = {}; -- 普通表 mymetatable = {__metatable="hi"}; -- 元表 setmetatable(mytable,mymetatable); -- 把mymetatable 设置成mytable的元表 mytable = setmetatable({},{}); -- 也可以写成这样 getmetatable(mytable); -- 返回mymetatable -- __index 作为键时 local table_A = { k1 = "Hello"} local table_B = {k2 = "world"} setmetatable(table_A,{ __index = table_B }) print(table_A.k1) print(table_A.k2) -- __index 是函数时 function fun1(table,key) print(table,"\n",key) return "hello" end local table_A = { k1 = "world"} setmetatable(table_A,{ __index = fun1 }) -- 会将table_A 和k1作为参数传递给fun1 print(table_A.k2) --- Lua 查找一个表元素时的规则,其实就是如下 3 个步骤: --- 1.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil; --- 如果 __index 方法是一个表则返回一个表,按2.3步骤查找 --- 2.在表中查找,如果找到,返回该元素,找不到则继续 --- 3.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
--- 2.__newindex作为键时
local table_A = { k1 = "hi"}
local table_B = {}
table_A = setmetatable(table_A,{__newindex = table_B})
table_A.k1 = "hihi"
table_A.k2 = "haha"
print("修改后的是:",table_A.k1,table_A.k2,table_B.k2)
-- __newindex为函数是
function fun4(table,key,value)
print(table,"\n",key,value)
end
local table_A = {k1 = "hi"}
setmetatable(table_A,{__newindex = fun4 })
table_A.k2 = "Good"
由于本人是自己学习总结出来的,有不足之处,请各位看官批评指出,我将及时改正,以提高知识总结的正确性和严谨性,为大家学习提供方便!!!
如若转载,请注明出处!!!