zoukankan      html  css  js  c++  java
  • 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, "
    ", 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无效)

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

  • 相关阅读:
    【dp】船
    【dp】PKU 1952 buy low,buy lower
    【dp】合唱队形
    【dp】导弹拦截
    【dfs】POJ1321 棋盘问题
    工程师工作与学习的模式
    如何进行大规模在线数据迁移(来自Stripe公司的经验)
    Laravel事件监听器listener与事件订阅者Subscriber的区别
    微信小程序时间处理问题
    [翻译] Facebook HHVM 团队封闭开发三周成果展
  • 原文地址:https://www.cnblogs.com/xiand/p/6902505.html
Copyright © 2011-2022 走看看