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)编程与元表元方法
版权声明:本文为博主原创文章,转载请注明出处. 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物. 早期的计算机编程是基于面向过程的方法,通过设计一个算法就可以解决当时 ...
随机推荐
- 用maven在eclipse用spring建javaweb工程(一)
一,步骤 只标注重点步骤: 新建工程选择Maven Project next---next---选择web工程 next---命名如下: 点击finish创建完成. 二,index.jsp和pom ...
- cp执行命令,如何直接覆盖不提示
参数说明 -i, --interactive prompt before overwrite (overrides a previous -n option) #文件存在是,交互式提示是否覆盖 - ...
- CentOS 6.5的安装详解
CentOS 6.5的安装详解 主流: 目前的Linux操作系统主要应用于生产环境, 主流企业级Linux系统仍旧是RedHat或者CentOS 免费: RedHat 和CentOS差别不大,Cent ...
- Oracle新实例创建
http://blog.itpub.net/29519108/viewspace-1443918/ 刚开始创建时,千万别点容器数据库,不然后面新建用户时,用户名前得加C##. 常用命令: sqlplu ...
- 用PhotoSwipe制作相册,手势可放大
1.引入css和js <link href="css/photoswipee.css" rel="stylesheet" type="text/ ...
- for i in xrange(0,5)使用过程中遇到的问题
文件中共有4行内容. fd = open("C:\Users\william\Desktop\dup_file - Copy (2).txt")for i in xrange(0, ...
- kali rolling 安装typecho
#1 apt-get install nginx php7.0 php7.0-mysql php7.0-gd php7.0-cgi php7.0-cli php7.0-curl php7.0-fpm ...
- Boolean对象 识记
Boolean 对象表示两个值:"true" 或 "false". 1.创建 new Boolean(value); //构造函数 返回 对象+返回值 Bool ...
- perl LWP::UserAgent获取源码与响应
#!/usr/bin/perl -w use strict; use LWP::UserAgent; my $useragent = new LWP::UserAgent; my $url = 'ht ...
- setAction方法 Snackbar 右侧按钮可以被点击并处理一些事件
从数据库同一记录取得的字段所组装成的对象应该是同一个对象,然后由不同的Session从数据库同一条记录上分别取得对象,它们的内存地址是不一样的. 一般来说,常见的数字加密方式都可以分为两类,即对称加密 ...