元表与元方法
 基本概念
        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. Educational Codeforces Round 31 A. Book Reading【暴力】

    A. Book Reading time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  2. springmvc适配器的应用

         前言     关于SpringMVC初始化ContextLoader中的XMLWebApplicationContext,以及DispatcherServlet初始化等等,这样的原理 已经有 ...

  3. ASP.NET基础题(1-10)

    1.简述 private. protected. public. internal 修饰符的访问权限. private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内 ...

  4. CV3

    Self Assessment: 1.        Skilled in developing with HTML/JavaScript/ASP.NET/C#, experienced in 3-l ...

  5. Map泛型集合-显示企鹅信息

    package collection; /** * 宠物类 * @author * */ public class Pet { private String name; private String ...

  6. 编译原理学习笔记·语法分析(LL(1)分析法/算符优先分析法OPG)及例子详解

    语法分析(自顶向下/自底向上) 自顶向下 递归下降分析法 这种带回溯的自顶向下的分析方法实际上是一种穷举的不断试探的过程,分析效率极低,在实际的编译程序中极少使用. LL(1)分析法 又称预测分析法, ...

  7. iptables 要点总结

    http://jiayu0x.com/2014/12/02/iptables-essential-summary/

  8. linux的file指令

    显示文件的类型,用命令 file 可以使你知道某个文件究竟是ELF格式的可执行文件, 还是shell script文 件或是其他的什么格式 例如:#file startx 语 法:file [-beL ...

  9. ASIHTTPRequest框架使用总结系列之阿堂教程4(下载数据)

    从本篇开始,阿堂准备进一步介绍ASIHTTPRequest框架下载数据和上传数据的实际应用.        为了实现多线程并发请求网络能力,ASIHTTPRequest被设计成 NSOperation ...

  10. 一个简单功能的SQL 实现

    1.假设有一张表示cj表 Name Subject Result 张三 语文 80 张三 数学 90 张三 物理 85 李四 语文 85 李四 数学 92 李四 物理 89 要求查询结果: 姓名 语文 ...