元表与元方法
 基本概念
        1.lua中每个值都有一个元表
        2.table和userdata可以有各自独立的元表
        3.其它类型的值共享其类型所属的单一元表
        4.lua在创建新table时不会创建元表
        5.其它基本类型的加减等操作都有预定义操作,table只能通过元表及元方法
        6.getmetatable(t)获得table的元表
        7.setmetatable(t, mt)设置table的元表为mt
        8.t={} mt={} setmetatable(t,mt) assert(getmetatable(t)==mt)
        9.任何table都可以作为任何值的元表,一组table可以共享同一个元表
        10.一个table也可以作为自己的元表
        11.在lua代码中只能设置table的元表,其它类型值的元表只能在C代码中设置
 算术类元方法
        __add(加法)对应"+"操作符
        __sub(减法)对应"-"操作符
        __mul(乘法)对应"*"操作符
        __div(除法)对应"/"操作符
        __unm(相反数) 对应一元"-"操作符
        __mod(取模)对应"%"操作符
        __pow(乘幂)对应"^"操作符
        __concat(连接)对应".."操作符
        __len(求长度)对应"#"操作符
        先找第一个值的元方法,如果没有再找第二个值的元方法,都没有报错
 关系类元方法
    __eq(等于)
    __lt(小于)
    __le(小于等于)
    没有大于和不等于元方法,但可以转化实现
          a~=b转化为not(a==b)
          a>b转化为b<a
          a>=b转化为b<=a
 库定义元方法
    __tostring(字符串转换)
         tostring函数会用此元方法进行转换
    __metatable(指向元方法)
         setmetatable、getmetatable会访问这个元方法
         如果设置成其它内容就可以起到保护元表的功能
    __mode(弱引用table模式)
        它的值是一个字符串
        如果包含"k"则表示table里的key是弱引用模式
        如果包含"v"则表示table里的value是弱引用模式
 table访问的元方法
    可以改变table行为的方法
    __index(访问表中不存在的字段)
          当没有这个元方法时访问不存在字段会返回nil
          当有元方法时两种访问形式
                作为函数时有两个参数,第一个是被访问的table,第二个是不存在的key
                作为table时就从这个table里找被访问的table里不存在的这个key
          通常用于实现继承特性
          作为函数的时候开销会大一些,但更灵活,可以实现多重继承和缓存等功能
          如果不想涉及元方法,可以使用rawget(t,i)"原始访问",不会加速代码执行
    __newindex(给表中不存在的字段赋值)
          当没有这个元方法时会在被访问的table里创建新字段并赋值
          当有元方法时两种访问形式
                作为函数时有三个参数,第一个是被访问的table,第二个是不存在的key,第三个是value
                作为table时,会在这个table里赋值而不是在被访问table里赋值
          可以使用rawset(t,k,v)绕过元方法赋值
    可以利用这两个元方法实现很多table的特殊功能
          1.具有默认值的table,把带有值的table作为__index元方法
          2.跟踪table的访问
              t = {} --原table
              local _t = t --私有化访问
              t = {}  --创建代码,名字相同
              mt = {}
              mt.__index = function(t,k)
                    print("access "..tostring(k))
                    return _t[k] --访问原来的table
              end
              mt.__newindex = function(t,k,v)
                    print("update "..tostring(k).." to "..tostring(v))
                    _t[k] = v --更新原来的table
              end
              setmetatable(t, mt)
              但这个例无法遍历原来的table,pairs只能操作代理table
          3.只读table,__index指向被访问table,__newindex弹错
 

lua学习笔记(八)的更多相关文章

  1. [转]LUA 学习笔记

    Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生 ...

  2. Lua 学习笔记(一)

    Lua学习笔记 1.lua的优势 a.可扩张性     b.简单     c.高效率     d.和平台无关 2.注释 a.单行注释 --        b.多行注释 --[[  --]] 3.类型和 ...

  3. Lua学习笔记6:C++和Lua的相互调用

        曾经一直用C++写代码.话说近期刚换工作.项目组中的是cocos2dx-lua,各种被虐的非常慘啊有木有.     新建cocos2dx-lua项目.打开class能够发现,事实上就是C++项 ...

  4. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理

    Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...

  5. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  6. (转)Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境

    Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一)注意:工程必须添加两个宏:“配置属性”/“C或C++”/“预处理器”/“预处理器定义”,添加两个宏:_CRT_SECURE_ ...

  7. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

  8. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  9. Lua学习笔记:面向对象

    Lua学习笔记:面向对象 https://blog.csdn.net/liutianshx2012/article/details/41921077 Lua 中只存在表(Table)这么唯一一种数据结 ...

  10. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

随机推荐

  1. codevs——1230 元素查找

    时间限制: 1 s 空间限制: 128000 Ks 题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 给出n个正整数,然后有m个询问,每个询问一个整数 ...

  2. Big5

    在以下各表中定义了 Big5 语言环境的代码范围: 平面 代码范围 描述 1 A140H - A3E0H 符号和中文控制代码 1 A440H - C67EH 常用字符 2 C940H - F9D5H ...

  3. Spring 依赖注入(控制反转)介绍

    耦合性是软件工程中的一个重要概念.对象之间的耦合性就是对象之间的依赖性.对象之间的耦合越高,维护成本越高.因此对象的设计应使类和构件之间的耦合最小. spring Ioc思想 控制翻转也就是sprin ...

  4. Flip Game -- LeetCode

    You are playing the following Flip Game with your friend: Given a string that contains only these tw ...

  5. Struts2笔记--文件上传

    Servlet 3.0规范的HttpServletRequest已经提供了方法来处理文件上传但这种上传需要在Servlet中完成.而Struts2则提供了更简单的封装. Struts2默认使用的是Ja ...

  6. SSO [ OAuth2.0 ]

    1) SSO英文全称Single Sign On,单点登录. SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 它包括可以将这次主要的登录映射到其他应用中用于同一个用户的 ...

  7. 深入理解MySQL中的Redo、Undo、MVCC

    http://edu.csdn.net/course/detail/3495 http://edu.csdn.net/courses/o317_a3/云计算大数据

  8. 了解一下运行软件的自我保护(RASP)

    看下这篇文章: http://www.jianshu.com/u/c89141b2d51e 相应的demo演示: https://github.com/xbeark/javaopenrasp

  9. 在自己的网站上使用RSS订阅功能

    要增加RSS订阅功能其实很简单 就是填写一个规定好的xml文档,按照要求填好就可以实现 具体的步骤如下: 这是在网上查到的RSSxml文档 <?xml version="1.0&quo ...

  10. Windows远程CentOS桌面

    Windows远程CentOS桌面 1.VNC 服务器配置 1) 安装vncserver yum install -y vnc-server 2) 修改配置 vi /etc/sysconfig/vnc ...