Lua笔记——表和元表

当有一个表为a
我们让b = a, 则b指向和a相同的表的内存
我们修改b[1],则a[1]也变了
我们令a=nil,则仅仅是说a指向空
但那个表还在, 故b仍然可用。
当b =nil时,  则已经找不到这个表了
但是其内存依然占用着
(因为已经无变量指向,故该内存属于泄露内存
可以用collectgarbage("collect") 进行回收
用collectgarbage("count")检查内存占用率
实际上,可以设置一个单步收集器,即每隔X步,自动进行无用内存的回收
"restart"、“setpause”、“setstepmul”、“step”、“stop”等执行)




table方法
table.concat(表,连接符,起始点,终止点)
则把表中元素用连接符连接起来,成为字符串
注意,只能是对应1、2、3这种索引
a="d"这种索引是不可连接的

table.insert(表, 【插入位置】, "插入元素"), 默认为最后一个插入
table.remove(表, 【删除位置】) , 默认为最后一个删除

table.sort(表)

获取table长度时, #表 和 table.getn(表) 都会在索引中断的地方停止计数
正确计算长度应该用pairs遍历,去计算长度。



元表指 为 table新增一些功能或者设定一些新功能
例如给某个table设置元表后
我们就可以给他 设定一些默认值,或者可以设定表1+表2

mytable = setmetatable(普通表, 元表)
则mytable就是普通表附加了元表的功能
调用getmetatable(mytable)后,可以返回对应的元表

常用的元方法:
_index,指找不到表中元素时,可以去这里找
例如
t   =   setmetatable ({1,2,3},   {   __index   =   other   })
则t中有3个索引1、2、3,对应值为1、2、3
当我们想要找4时,就去index里找
index也可以指向一个函数__index = function(mytable, key)   end
Lua查找一个表元素时的规则,其实就是如下3个步骤:
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果__index方法是一个函数,则返回该函数的返回值。

_newindex, 用于赋值,当对一个不存在的键赋值时,则调用这个函数或者赋值到newindex对应的新表中,而不是直接就赋值了。

__add  __sub  __mul __div __mod  __unm __concat __eq __lt __ le          则为表设定运算符

mytable = setmtatable({1,2,3}, {
    __add = function(mytable,  表或数字)
        balabalba
       return balbalbla
})

__call, 则可以把表当函数,传入参数并计算
mytable = setmetatable({10}, 
__call = function(mytable ,  参数)
    balbal
    return 结果
)
则我们可以执行  matable(参数)去获得一个值


__tostring元方法
修改表的输出行为。即print行为
__tostring = function(mytable)
    balbalbal
    return XXX
则print(mytable) 则输出XXX


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值