元表与元方法
 基本概念
        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. POJ 2923 【01背包+状态压缩/状压DP】

    题目链接 Emma and Eric are moving to their new house they bought after returning from their honeymoon. F ...

  2. (寒假集训)Watering the Fields (最小生成树)

    Watering the Fields 时间限制: 1 Sec  内存限制: 64 MB提交: 26  解决: 10[提交][状态][讨论版] 题目描述 Due to a lack of rain, ...

  3. luogu P1284 三角形牧场

    题目描述 和所有人一样,奶牛喜欢变化.它们正在设想新造型的牧场.奶牛建筑师Hei想建造围有漂亮白色栅栏的三角形牧场.她拥有N(3≤N≤40)块木板,每块的长度Li(1≤Li≤40)都是整数,她想用所有 ...

  4. 【OpenJudge7624】【区间DP】山区建小学

    山区建小学 总时间限制: 1000ms 内存限制: 65536kB [描述] 政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往.已知任意两 ...

  5. Runtime对象

    Runtime简单概念: Runtime:每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接. * 这也是jvm实现跨平台的一个重要原因. * 可以通过 ge ...

  6. C语言基础之注释与常见错误

    总结起来,注释有三种: 1.单行注释 1: //哈哈 单行注释 2.多行注释 1: /* 2: asdfasdfasdfasdfasdf 3: */ 其中多行注释如果这样写 1: /* 2: * 函数 ...

  7. Handler嵌套--可以

    package com.example.handlernestdemo; import android.support.v7.app.ActionBarActivity; import android ...

  8. CentOS 6.9安装类型选择(Basic Server/Web Server)

    Desktop :基本的桌面系统,包括常用的桌面软件,如文档查看工具. Minimal Desktop:基本的桌面系统,包含的软件更少. Minimal:基本的系统,不含有任何可选的软件包. Basi ...

  9. ubifs笔记

    第1章 UBIFS UBIFS不是工作在块在设备之上,所以UBIFS不能用于MMC之类的设备. 与传统的flash文件不同,UBIFS不是工作是块设备之上.传统的flash文件系统(如Jffs2)工作 ...

  10. JAVA常见算法题(一)

    package com.xiaowu.demo; // 有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第四个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少? /** * ...