源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Lua中的table浅析

  • 时间:2020-10-24 15:13 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Lua中的table浅析
Lua的table提供了Map的功能,实现了"关联数组",并且整数、字符串甚至nil都可以作为索引/key;table没有固定的大小。   基于table,可以表示普通数组、符号表、集合、记录、队列和其他数据结构。   而Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如io.read表示使用"read"来索引table io。   在Lua中,table既不是值也不是"变量",而是对象,可以类比Java中的数组。   table是通过构造表达式的,最简单的就是{}
[u]复制代码[/u] 代码如下:
> a={} > a['name'] = 'wyj' > =a.name wyj
  table永远是匿名的,一个持有table的变量与table自身没有固定的关联性:
[u]复制代码[/u] 代码如下:
> b = a > b.name = 'ljq' > =a.name ljq > b = nil > =a.name ljq
  b['name']和b.name等价,而对于数字只能使用b['3']的形式,同Javascript。   同其他对象一样,当没有table的引用时,Lua的垃圾回收器最终回收table。   其实Lua将全局变量存储在一个table中。   table的长度可以通过#获取(#还可以获取字符串的长度)
[u]复制代码[/u] 代码如下:
> table = {} > for i = 1,10 do >> table[i] = i >> end > =#table 10
但不是所有情况都适用
[u]复制代码[/u] 代码如下:
> table = {} > table[3] = 3 > table.name = 'wyj' > =#table 0
  实际上,在第一次碰到nil时,就认为是结束标志
[u]复制代码[/u] 代码如下:
> table = {} > table[10] = 10 > =#table 0 > table[1] = 1 > =#table 1
这一点,不同于Javascript的数组长度的行为。 [img]http://files.jb51.net/file_images/article/201409/201492392331301.png?20148239242[/img] 上面提到构造表达式{},介绍一下复杂一点的构造表达式:
[u]复制代码[/u] 代码如下:
a = {'wyj', 'lmy'} a= {x = 10, y = 20,l='s'}
但是下面的方式不正确
[u]复制代码[/u] 代码如下:
> a={1=3} stdin:1: '}'expected near '=' > a={'x'=3} stdin:1: '}'expected near '='
而应该这样使用:
[u]复制代码[/u] 代码如下:
> x = {[1] = 3,['name'] = 'www'} > =x[1] 3 > =x.name www
  table还可以嵌套
[u]复制代码[/u] 代码如下:
> a = {x = {y =1}} > =a.x.y 1
更复杂的方式,可以调用函数初始化 > x ={math.sin(3)} > =x[1] 0.14112000805987   另外需要特别注意的是,无label的项会自动生成整数的label
[u]复制代码[/u] 代码如下:
> x = {1, 2, [2]=3, 4,5} > =x[1] 1 > =x[2] 2 > =x[3] 4
所以,显式的label为整数的情况下要特别小心。   另外支持用;替换,
[u]复制代码[/u] 代码如下:
>x={x=1;y=2; 'one', 'two'} > xx 1 > =x[1] one
unpack NoteGem Horizontal Line 内置函数unpack可以提取key为1.2.3...的元素
[u]复制代码[/u] 代码如下:
> t = {x=3,y=4,5,6,7} > unpack(t) > =unpack(t) 5        6        7 > a,b,c = unpack(t) --Lua支持多重赋值 > print(a,b,c) 5        6        7   > functionsum(a,b,c) >> return a +b + c >> end > =sum(unpack(t)) 18
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部