目录
本文用于记录和总结我对Lua元表和元方法的学习与了解。元方法的函数名都以两个下划线开头,为了能看出是两个下划线,下面在文字描述部分都用下划线空格下划线的方式表现“_ _”。
一、set get元表
Lua语言中只能为table 设置元表:setmetatable(), getmetatable()。
testTable = {}
testMetaTable = {}
setmetatable(testTable, testMetaTable)
print(getmetatable(testTable) == testMetaTable) -- output:true
注意:
- 字符串都共有一个元表(字符串标准库设置),其他类型默认没有元表。
- 一个表可以成为自己的元表,用于描述自身特有的行为。
二、元方法
1.算数运算相关的元方法
_ _add | 加法 | _ _band | 按位与 |
_ _mul | 乘法 | _ _bor | 按位或 |
_ _sub | 减法 | _ _bxor | 按位异或 |
_ _div | 除法 | _ _bnot | 按位取反 |
_ _idiv | floor除法 | _ _shl | 向左移位 |
_ _unm | 负数 | _ _shr | 向右移位 |
_ _mod | 取模 | ||
_ _pow | 幂运算 | _ _concat | 连接运算符 |
2.关系运算相关的元方法
_ _le | 小于或等于 |
_ _eq | 等于 |
_ _lt | 小于 |
3.库定义相关的元方法
_ _tostring
_ _metatable get/set会用到
_ _pairs
4.表相关的元方法
_ _index, _ _newindex, _ _len (#t 调用)
三.常见问题:
问题1. table A = {}, table B 是A的元表,当访问A.xxx 的时候,会调用B的_ _index元方法,问_ _index 的参数是什么?
回答:是A,和 xxx;即 B._ _index = function(_, key) end
_ 为 A,key 为 xxx;
总结
元表和元方法是Lua语言编程中很重要的一部分,工程中常用于实现继承特性。也会常出现在面试过程中。
参考文献:
书:Lua程序设计