Lua学习笔记(二)

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

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值