table中index、newindex、rawget、rawset的一段代码及理解
1 print("lua 中 table 就是一种对象的体现") 2 3 4 function string:xsplite( delimiter ) 5 local tmptb = {} 6 if self == nil or self=='' or delimiter==nil then 7 return nil 8 elseif delimiter == '' then 9 table.insert(tmptb,self) 10 return tmptb 11 else 12 self = self .. delimiter 13 for s in self:gmatch("(.-)"..delimiter) do 14 table.insert(tmptb,s) 15 end 16 return tmptb 17 end 18 end 19 20 str = 'lua "/Users/xuyang/Desktop/Test_demo/Lua/table_obj.lua"' 21 ttb = str:xsplite('/') 22 23 -- print(unpack(ttb)) 24 -- print(table.concat( ttb, "\n", 1, #ttb )) 25 26 27 --关闭lualde的代码提示功能 28 mm = {zxy='UU的'} --预计访问的表 29 30 31 mt = {} 32 --mt.__index = {xyz='老子的'} --处理取值行为,与下面效果等同 33 mt.__index = function ( table,key) 34 if key=='xyz' then 35 key = '老子的' 36 return key 37 end 38 end --处理取值行为 39 40 mt.__newindex = function ( table,key,value ) --处理赋值行为 41 if key == 'xyz' then 42 rawset(table,"xyz",'你大爷') -- rawset(...) 进行赋值 43 else 44 table.key='滚犊子' 45 end 46 end 47 setmetatable(mm, mt) --设置mm表的默认值为mt,此时mm会继承mt所有的元素属性值 48 49 print('mm.zxy',mm.zxy) --正常的表访问 50 51 print('mm.xyz',mm.xyz) --访问表中没有的元素 52 print('mm.xyz',rawget(mm,xyz)) --rawget方法只访问当前table,不访问 __index元方法的赋值 53 -------------------- 54 mm.xyz = "嘿嘿嘿" --给表中不存在的索引进行赋值:当给不存在的表进行赋值时,会检查是否__newindex元方法,如存在则执行该方法进行赋值 55 print('嘿嘿嘿 >>>',mm.xyz) 56 57 -- mm.zzzs = "嘻嘻" --该赋值操作会导致overflow 58 print('嘻嘻 >>>',rawget(mm,mm.zzzs))
结果输出:
1 lua 中 table 就是一种对象的体现 2 mm.zxy UU的 3 mm.xyz 老子的 4 mm.xyz nil 5 嘿嘿嘿 >>> 你大爷 6 嘻嘻 >>> nil
理解概述
__index是
__newindex是
rawset是
rawget是
总结:取值的元方法定义、赋值的元方法定义、设置new的元方法值(并返回)、仅获取当前表,不获取元方法定义(使index无效)
微信搜索【水勺子】关注我,或直接扫描下发二维码