元表与元方法
 基本概念
        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. (14)oracle数据字典

    http://czmmiao.iteye.com/blog/1258462 数据字典解释 1.user_tables 查询用户所拥有的所有表 select table_name from user_t ...

  2. Ngnix 安装常见错误的处理

    错误:   解决方案:(联网下) 出现上面的问题是由于没有c++编译器造成 # yum -y install gcc-c++   使用上面的命令即可安装c++解决问题 如果确实c编译器,使用如下命令解 ...

  3. C语言基础之指针

    1.指针的定义 格式:变量类型 *变量名; 1: // 定义了一个指针变量p 2: // 指针变量只能存储地址 3: // 指针就一个作用:能够根据一个地址值,访问对应的存储空间 4: // 指针变量 ...

  4. dragon-book-exercise-answers

    https://github.com/fool2fish/dragon-book-exercise-answers

  5. [置顶] kubernetes--应用程序健康检查

    K8S的应用程序健康检查分为livenessProbe和readinessProbe,两者相似,但两者存在着一些区别. livenessProbe在服务运行过程中检查应用程序是否运行正常,不正常将杀掉 ...

  6. vue axios跨域请求,apache服务器设置

    问题所在axios请求会发送两次请求 也就是说,它会先使用options去测试,你这个接口是否能够正常通讯,如果不能就不会发送真正的请求过来,如果测试通讯正常,则开始正常请求. 思路: 跨域--> ...

  7. java内存溢出分析工具:jmap使用实战

    在一次解决系统tomcat老是内存撑到头,然后崩溃的问题时,使用到了jmap. 1 使用命令 在环境是linux+jdk1.5以上,这个工具是自带的,路径在JDK_HOME/bin/下 jmap -h ...

  8. 数据库读写锁的实现(C++)

    一.基本概念 在数据库中,对某数据的两个基本操作为写和读.分布有两种锁控制:排它锁(X锁).共享锁(S锁). 排它锁(x锁):若事务T对数据D加X锁,则其他不论什么事务都不能再对D加不论什么类型的锁. ...

  9. Java:网络编程之应用实例

    1.聊天 编写一个聊天程序,有收数据的部分和发数据的部分. 这两部分需要同时执行,那么就需要多线程技术. 一个线程控制发送. 一个线程控制接收. 因为收和发动作是不一致的,所以要定义两个run方法,而 ...

  10. Qt中的非模式窗口配置;

    Test7_5A::Test7_5A(QWidget *parent) : QMainWindow(parent){ ui.setupUi(this); m_searchwin = new Searc ...