lua之table

来源:互联网 发布:网络机顶盒怎么看电视 编辑:程序博客网 时间:2024/05/20 04:10

1、table是Lua中唯一的数据结构,其他语言所提供的数据结构都是通过table来实现的;

(1)在Lua中通过整数下标访问table中的元素,就是数组,并且数组的大小不是固定的,可以动态增长。

a = {} --新建一个table

for i = 1, 1000 do

a[i] = 0

end

给数组的每一个元素赋值,范围之外的元素为nil,在Lua中默认的下标是从1开始的,标准库中的方法都是以此为标准。

(2)在Lua中也可以通过key来访问和设置元素,同样用键值对来查询数据。

a = {}

a["name"] = "wahaha"

a["age"'] = 100

2、Lua中的集合和包也是通过table来实现的,将集合中的所有数据和方法放在一个统一的table中,根据table来取出

包中的数据

3、元表和元方法:metatable / metamethod

Lua中metatable可以允许我们改变table的行为,比如可以定义metatable来定义两个table的相加行为,Lua中的每一个表都有其metable,默认创建一个不带metatable

的新表

t1 = {}

getmetatable(t1) -- 获取元表

t1 = {}

setmetatable(t1,t2) --设置元表,t1的元表为t2

任何表都可以是其他一个表的元表,一组行为类似的表可以共享一个metatable来描述他们的共有行为。一个表也可以是自身的metatable来描述其自身的私有行为

对于每一个算数运算符,metatable都有对应的域名与其对应,__add、__mul、__sub、__div、__unm(负数)、__pow(幂)、__concat(连接行为)

Lua选择metatable的原则:如果第一个参数存在带有__add域的metatable,Lua使用它作为metatable作为metatable,和第二个参数无关,若第二个参数带有__add域的metatable,Lua使用它作为metatable否则报错。

对于关系运算发、Lua使用__eq等于、__lt小于、__le小于等于来作为元表

::针对表的不存在的域的查询和修改,Lua提供了改变table的行为的方法

(1)__index 元方法

当我们访问一个表的不存在的域,返回结果为nil,其实是先访问__index元方法,如果__index存在则由这个元方法来继续返回结果,类似于继承

__index既可以是一个函数,也可以是一个表,当用表来赋值__index时简单高效,去查找表中的域,当__index是一个函数时有更多的灵活性来实现多继承,隐藏和变异的机制。

(2)__newindex元方法

__newindex元方法用来对表更新,__index用来对表进行访问,当你对表中不存在的域赋值时,如果存在__newindex则调用此元方法,否则才进行赋值,



0 0
原创粉丝点击