stable.unpack
table1={1,2,3}
print(table.unpack(table1))
元表:
元表里有两个比较常用的方法,分别是__index和__newindex
__newindex是用于元素的更新
当访问 table 中不存在的 key,并对其赋值的时候,lua 会查找 __newindex 元方法,如果存在,调用该方法,如果不存在,直接对该key进行赋值操作。
该方法可用于构建只读的table。
function GetReadOnlyTable(t)
local meta = {
__index = t,
__newindex = function ()
error("read-only table!")
end
}
local newTable = {}
setmetatable(newTable, meta)
return newTable
end
__index是元素的查找,具体作用如下
table模拟类的继承
原理:lua查询一个元素会经过以下步骤
1:先在表自身查找,找到返回该元素,没有找到执行下一步
2.判断该表有没有元表,没有返回nil,有则执行下一步
3.判断元表里index方法是否为nil,若为nil,返回nil。若不是,若index方法为一个函数,则返回函数的返回值,若为一张表,则去index方法指向的表中查找(重复这个过程)
实例:
总结:设置该table的原表和__index
table1={}
function table1:New()
local temTable={}
setmetatable(temTable,self)
self.__index=self
return temTable
end
函数闭包
首先了解两个概念:
词法定界:当一个函数内嵌套另一个函数的时候,内函数可以访问外部函数的局部变量,这种特征叫做词法定界
第一类值:lua当中函数是一个值,他可以存在变量中,可以作为函数参数,可以作为返回值
闭包:通过调用含有一个内部函数加上该外部函数持有的外部局部变量(upvalue)的外部函数(就是工厂)产生的一个实例函数
闭包组成:外部函数+外部函数创建的upvalue+内部函数(闭包函数)
获取table长度:#table,unpack(table)—(二分法查找长度,所以获取的table长度不一定准确),遍历长度增加
table底层储存数据分为数组和哈希表
table底层插入:rehash条件:首先插入的是一个大于0的正整数,其次没有超过数组长度,并且还要保证数组的空间利用率大于50%
lua pairs循环
local 化的变量会更快
local t = {}local table_insert = table.insert
for i=1,1e7 do table_insert(t, i)end
table.sort源码采用快排,当其遇到第一个nil值时,就返回从1到该值的排序后的table,所以它对内部键不连续的table作用不大
table.sort,在使用的时候可能会出现
attempt to compare number with nil ,
invalid order function for sorting
这两个错误,或者没有报错但是排序的结果不对。
是因为 table.sort 在实现快速排序时没有做边界检测。
可以考虑如下形式编写排序规则
local function comp(a,b)
if a == nil or b == nil then
return false
end
if a == b then
return false
end
return a < b
end
table.sort(t,comp)
table.remove(table[,pos]):删除在pos位置上的元素
注意:该函数删除元素时,被删数据后面的数据会向前移一位
所以,如果你想在循环里删除数据,就会出问题,例如:
local temTable = {}
for i=1,5 do
table.insert(temTable,i)
end
for i=1,#temTable do
if temTable[i]==3 or temTable[i]==4 then
table.remove(temTable,i)
end
end
for i=1,#temTable do
print(temTable[i])
end
因为lua中的循环起始值只会计算一次,
(即,for i=1,#temtable中的#temtable在开始=5,即使后面过程中table.remove使得#temtable变成了4,也不会影响外部的#temtable)
并且table里的数据被remove前移一位,所以,4并没有被删除
针对这种情况,可以直接另起一个数组来筛选数据
next函数,next(table[,index]),对table是否为空表进行判定,如果参数为非table会报错,false即table为空