Lua学习笔记-metatable元表

本以为看完C API lua就学的差不多了,没想到越陷越深啊。

首先说元表的概念,元表是一个特殊的表,作用是定义一个表的操作。类似于C++中类的运算符重载。

使用元表需要注意的事项:

1.元表可以定义的操作有下面这些

 1 __add(a, b) --加法
 2 __sub(a, b) --减法
 3 __mul(a, b) --乘法
 4 __div(a, b) --除法
 5 __mod(a, b) --取模
 6 __pow(a, b) --乘幂
 7 __unm(a) --相反数
 8 __concat(a, b) --连接
 9 __len(a) --长度
10 __eq(a, b) --相等
11 __lt(a, b) --小于
12 __le(a, b) --小于等于
13 __index(a, b) --索引查询
14 __newindex(a, b, c) --索引更新(PS:不懂的话,后面会有讲)
15 __call(a, ...) --执行方法调用
16 __tostring(a) --字符串输出
17 __metatable --保护元表

2.上面的操作其实是table中一个键对应一个函数,键字符串前面是双下划线(简直坑啊,第一次写半天没发现错误)

3.如果两个表都有定义元表,那么按照下面原则调用:

  • 对于二元操作符,如果第一个操作数有元表,并且元表中有所需要的字段定义,比如我们这里的__add元方法定义,那么Lua就以这个字段为元方法,而与第二个值无关;
  • 对于二元操作符,如果第一个操作数有元表,但是元表中没有所需要的字段定义,比如我们这里的__add元方法定义,那么Lua就去查找第二个操作数的元表;
  • 如果两个操作数都没有元表,或者都没有对应的元方法定义,Lua就引发一个错误。

元表的设置与获取

1 setmetatable(table,metatable): 对指定table设置元表(metatable),如果元表(metatable)中存在__metatable键值,setmetatable会失败 。
2 getmetatable(table): 返回对象的元表(metatable)。

下面是例子,这个例子是简单的定义一个“+”运算符,将两个table中对应键的值相加再返回一个新表。至于表的大小是否相等,对应位置类型是否一致,没有做细节处理,这些不是重点。

 1 function add(a,b)            --定义__add需要用到的函数
 2  local sum={}
 3  for i,v in ipairs(a) do
 4   sum[i]=a[i]+b[i]
 5  end
 6 return sum
 7 end
 8
 9 a={1,2,3}
10 b={9,8,7}
11 t={__add=add}          --声明一个表t作为元表,其中__add键对应的值为add函数
12 setmetatable(a,t)      --设置a的元表为t
13 sum=a+b                --计算a+b,返回新表sum,并且打印
14 for i in ipairs(sum) do
15 print(sum[i])
16 end
17
18 运行结果:
19 10
20 10
21 10
时间: 2024-10-29 10:00:11

Lua学习笔记-metatable元表的相关文章

Lua学习笔记4:类及集成的实现

-- Lua中类的实现 -------------------------------- 基类 ---------------------------- classBase = {x = 0,y = 0} -- x,y为类的成员变量 classBase.__index = classBase -- 这句是重定义元表的索引,必须要有 --模拟构造体,一般名称为new() function classBase:new(x,y) local self = {}     -- 初始化对象自身 setme

[转]LUA 学习笔记

Lua 学习笔记 入门级 一.环境配置 方式一: 1.资源下载http://www.lua.org/download.html 2.用src中的源码创建了一个工程,注释调luac.c中main函数,生成了一个exe,直接可以测试lua了 方式二(推荐): 从https://code.google.com/p/luaforwindows/ 下载“LuaForWindows_v5.1.4-46.exe”,一键安装即可  二.执行 lua xxx.lua 三.注释 1.行注释格式:-- 2.块注释格式

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

Lua学习笔记9:多文件

一 终端中执行多个文件:-l 加入在文件一中定义了一个变量,在另一文件中输出这个变量,代码如下: --file1.lua num = 100 --file2.lua print(num) 终端输入(注意:不是lua命令行): lua -lfile1 -lfile2 注意:不要加上文件后缀名.lua 二 命令行中加载文件 --lib.lua function norm(x, y) local n2 = x^2 + y^2 return math.sqrt(n2) end function twic

lua学习笔记10:lua简单命令行

前面多次用了命令行,这次就好好学下命令行: 一 格式 lua [options][script][args] 二 具体命令 -e 直接将命令传个lua -l 加载一个文件 -i 进入交互模式 例如,终端输入: lua -e "print(math.sin(12))" lua学习笔记10:lua简单命令行,布布扣,bubuko.com

lua学习笔记11:lua中的小技巧

lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一 巧用or x = x or v 等价于: if not x then x = v end 如果x为nil或false,就给他赋值为 二 三元运算符实现 a and b or c 类似C语言: a ? b : c and 的运算由优先级高于or lua学习笔记11:lua中的小技巧,布布扣,bubuko.com

Lua学习笔记(三):表的构造

构造器是创建和初始化表的表达式.表是Lua特有的功能强大的东西.最简单的构造函数是{},用来创建一个空表.可以直接初始化数组: 1 days = {"Sunday", "Monday", "Tuesday", "Wednesday", 2 "Thursday", "Friday", "Saturday"} Lua将“Sunday”初始化days[1](第一个元素索引为

lua学习笔记之基本语法

Lua学习笔记之基本语法 1.  赋值语句 赋值是改变一个变量的值和改变表域的最基本的方法. a = "hello".."world" t.n = t.n+1 lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会一次赋给左边的变量. a,b = 10,2*x    <-->a = 10;b = 2*x 遇到赋值语句lua会先计算右边所有的值然后再执行赋值操纵,所以我们可以这样进行交换变量的值: x,y = y,x    

lua学习笔记之函数

Lua学习笔记之函数 1.  函数的作用 函数主要完成指定的任务,这样的情况下函数作为调用语句使用,函数可以计算并返回值,这样的情况下函数作为赋值语句的表达式使用. 语法: funcationfunc_name(arguments-list) Statements-list end 调用函数的时候,如果参数列表为空,必须使用()表示是函数调用. Print(8*9,9/8) a = math.sin(3) +math.cos(10) print(os.date()) 上述规则有一个例外,当函数只