通常,Lua中的每个值都有一套预定义的操作集合。

例如:可以将数字相加、可以连接字符串、可以在table中插入一对key-value等。

但是无法将两个table相加,无法对函数作比较,或无法调用一个字符串。

  可以通过元表来修改一个值的行为,使其在面对一个非预定义的操作时执行一个指定的操作。

例如:假设a和b都是table,通过元表可以定义如何计算表达式a + b。当Lua试图将两个table相加时,它会先检查两者之一是否有元表。

然后检查该元表中是否有一个叫__add的字段。如果Lua找到了该字段,就调用该字段对应的值。这个值也就是所谓的“元方法”。

  Lua中的每个值都有一个元表,table和userdata可以有各自独立的元表。而其它类型的值按类型共享元表。

也就是说所有的数字都共享同一个元表,所有的字符串共享一个元表等等。默认情况下,值是没有元表的,但字符串库在

初始化的时候为字符串类型设置了元表。

Lua在创建新的table时不会创建元表:

t = {}
print(getmetatable(t)) --> nil

可以通过setmetatable来设置或修改任何table的元素:

t1 = {}
setmetatable(t,t1)
assert(getmetatable(t) == t1)

在Lua代码中,只能设置table的元表,若要设置其他类型的值的元表,请使用C API。

在后面的章节会看到,标准的字符串程序库为所有的字符串都设置了一个元表,其他类型默认是没有元表的。

print(getmetatable("hi"))        -->table :0x80772e0
print(getmetatable("xuxu")) -->table :0x80772e0
pirnt(getmetatable()) -->nil
pirnt(getmetatable(print)) -->nil

任何的table都可以作为其他值的元表,而一组相关的table也可以共享一个通用的元表,此表描述了它们共同的行为。

一个table甚至可以作为自己的元表,用于描述其特有的行为。

以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

chapter 13_0 元方法的更多相关文章

  1. chapter 13_3 table访问的元方法

    前两节的算术类.关系类运算符的元方法都为各种错误情况定义了行为,它们不会改变语言的常规行为. 但是Lua还提供了两种可以改变table行为的方法: 一种是查询table中不存在的字段.一种是修改tab ...

  2. chapter 13_2 关系类、库定义的元方法

    元表还可以指定关系操作符的含义,元方法为__eq ,__lt(小于) ,__le(小于等于). 而其它3个关系操作符则没有单独的元方法,Lua会 把a ~= b 转化为not(a == b) 将a&g ...

  3. chapter 13_1 算术类的元方法

    假设用table来表示集合,用function去计算集合的交集.并集. 为了保持名称空间的整齐,将这些函数存入一个名为Set的table中. 现在,假设用“+”来计算两个集合的并集,那么就要让所有用于 ...

  4. Lua 学习笔记(十一)元表与元方法

    在Lua中的每个值都有一套预定义的操作集合.例如可以将数字相加,可以连接字符串,还可以在table中插入一对key-value等.但是我们无法将两个table相加,无法对函数作比较,也无法调用一个字符 ...

  5. lua元表与元方法

    lua中提供的元表(metatable)与元方法(metamethod)是一种非常重要的语法,metatable主要用于做一些类似于C++重载操作符式的功能. lua中提供的元表是用于帮助lua变量完 ...

  6. lua 元表与元方法示例

    -- 1.检查是否有元表local t = {1, 2}print(getmetatable(t))     -- nilprint("----------------------" ...

  7. Lua __index元方法

    [Lua __index元方法] 当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键.如果__ ...

  8. lua元表和元方法 《lua程序设计》 13章 读书笔记

    lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在创建table时不会创建元表. t = {} print(getmet ...

  9. 【quick-cocos2d-x】Lua 面向对象(OOP)编程与元表元方法

    版权声明:本文为博主原创文章,转载请注明出处. 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物. 早期的计算机编程是基于面向过程的方法,通过设计一个算法就可以解决当时 ...

随机推荐

  1. python2 基础

    标识符 标识符是由字母,下划线和字母组成的字符序列标识符必须以字母,下划线开头,不能以数字开头标识符不能是关键字标识符可以为任意长度 算术运算符+-*///**% 科学记数法 aEb 或者aE+b例: ...

  2. django manage.py 的各种功能

    [简介] django-admin.py是Django的一个用于管理任务的命令行工具.本文将描述它的大概用法. 另外,在每一个Django project中都会有一个manage.py.manage. ...

  3. js数组操作-打乱数组

    <style> html, body { margin: 0; padding: 0;} div span { display: inline-block; width: 25px; he ...

  4. C#删除只读文件或文件夹(解决File.Delete无法删除文件)

    引用: http://www.jb51.net/article/72181.htm   C#删除只读文件的方法: if (File.GetAttributes(FFName).ToString().I ...

  5. ES 6 : 数组的扩展

    1.Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象和可遍历(iterable)对象. 下面是一个类似数组的对象,Array.from将它转为真正的数组. ...

  6. Hihocode 1015 KMP算法

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. ...

  7. Mac Java maven环境变量

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #fffff ...

  8. CVE-2015-5122 简要分析(2016.4)

    CVE-2015-5122 简要分析 背景 最近在学习Flash漏洞的分析,其与IE漏洞的分析还是有诸多的不同(不便)之处,折腾了一阵子终于克服了没有符号表.Flash的超时定时器等问题.所以找到了去 ...

  9. python--函数式登录程序

    # Author:Tim Gu def login(username,password): """这个login函数用于用户登录的验证 :param username:用 ...

  10. mac版tomcat修改端口无法访问,80端口无法访问

    在mac上安装好了tomcat,修改了端口为80,没想到关闭tomcat时提示出错,而且无法访问,原来我犯了两个错误. 1.我用的是mac上的文本编辑.app打开然后修改的,重新修改为8080也不行, ...