Lua学习笔记(二)

stable.unpack

 

table1={1,2,3}
print(table.unpack(table1))

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为空

参考


版权声明:本文为qq_41950186原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。