chapter 13_0 元方法
通常,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 元方法的更多相关文章
- chapter 13_3 table访问的元方法
前两节的算术类.关系类运算符的元方法都为各种错误情况定义了行为,它们不会改变语言的常规行为. 但是Lua还提供了两种可以改变table行为的方法: 一种是查询table中不存在的字段.一种是修改tab ...
- chapter 13_2 关系类、库定义的元方法
元表还可以指定关系操作符的含义,元方法为__eq ,__lt(小于) ,__le(小于等于). 而其它3个关系操作符则没有单独的元方法,Lua会 把a ~= b 转化为not(a == b) 将a&g ...
- chapter 13_1 算术类的元方法
假设用table来表示集合,用function去计算集合的交集.并集. 为了保持名称空间的整齐,将这些函数存入一个名为Set的table中. 现在,假设用“+”来计算两个集合的并集,那么就要让所有用于 ...
- Lua 学习笔记(十一)元表与元方法
在Lua中的每个值都有一套预定义的操作集合.例如可以将数字相加,可以连接字符串,还可以在table中插入一对key-value等.但是我们无法将两个table相加,无法对函数作比较,也无法调用一个字符 ...
- lua元表与元方法
lua中提供的元表(metatable)与元方法(metamethod)是一种非常重要的语法,metatable主要用于做一些类似于C++重载操作符式的功能. lua中提供的元表是用于帮助lua变量完 ...
- lua 元表与元方法示例
-- 1.检查是否有元表local t = {1, 2}print(getmetatable(t)) -- nilprint("----------------------" ...
- Lua __index元方法
[Lua __index元方法] 当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键.如果__ ...
- lua元表和元方法 《lua程序设计》 13章 读书笔记
lua中每个值都有一个元表,talble和userdata可以有各自独立的元表,而其它类型的值则共享其类型所属的单一元表.lua在创建table时不会创建元表. t = {} print(getmet ...
- 【quick-cocos2d-x】Lua 面向对象(OOP)编程与元表元方法
版权声明:本文为博主原创文章,转载请注明出处. 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物. 早期的计算机编程是基于面向过程的方法,通过设计一个算法就可以解决当时 ...
随机推荐
- python2 基础
标识符 标识符是由字母,下划线和字母组成的字符序列标识符必须以字母,下划线开头,不能以数字开头标识符不能是关键字标识符可以为任意长度 算术运算符+-*///**% 科学记数法 aEb 或者aE+b例: ...
- django manage.py 的各种功能
[简介] django-admin.py是Django的一个用于管理任务的命令行工具.本文将描述它的大概用法. 另外,在每一个Django project中都会有一个manage.py.manage. ...
- js数组操作-打乱数组
<style> html, body { margin: 0; padding: 0;} div span { display: inline-block; width: 25px; he ...
- C#删除只读文件或文件夹(解决File.Delete无法删除文件)
引用: http://www.jb51.net/article/72181.htm C#删除只读文件的方法: if (File.GetAttributes(FFName).ToString().I ...
- ES 6 : 数组的扩展
1.Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象和可遍历(iterable)对象. 下面是一个类似数组的对象,Array.from将它转为真正的数组. ...
- Hihocode 1015 KMP算法
时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. ...
- Mac Java maven环境变量
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #fffff ...
- CVE-2015-5122 简要分析(2016.4)
CVE-2015-5122 简要分析 背景 最近在学习Flash漏洞的分析,其与IE漏洞的分析还是有诸多的不同(不便)之处,折腾了一阵子终于克服了没有符号表.Flash的超时定时器等问题.所以找到了去 ...
- python--函数式登录程序
# Author:Tim Gu def login(username,password): """这个login函数用于用户登录的验证 :param username:用 ...
- mac版tomcat修改端口无法访问,80端口无法访问
在mac上安装好了tomcat,修改了端口为80,没想到关闭tomcat时提示出错,而且无法访问,原来我犯了两个错误. 1.我用的是mac上的文本编辑.app打开然后修改的,重新修改为8080也不行, ...