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无效)

 

微信搜索【水勺子】关注我,或直接扫描下发二维码

posted @ 2017-05-25 10:42  咸的  阅读(748)  评论(0编辑  收藏  举报