Lua talbe's pairs & ipairs & traverse loop, table.pack and table.unpack

Lua 表有几种形式用得比较多,
一种是sequence, 一种是table, 还有一种是list.

1. sequence指没有气泡的一些元素. 例如{"hello", "nihao","yes"}是一个sequence, 索引为1开始的自增数字.

但是{"hello", "nihao", nil, "yes"} 不算序列. 因为中间有个nil气泡.

> t = {"hello", "nihao", nil, "yes"}
> for i,v in ipairs(t) do
>> print (i,v)
>> end
1       hello
2       nihao
使用ipairs遍历t表只输出前两个值

2. table指key, value形式存储的表.

例如tbl = {a="nihao", b=nil, c="hello", d="yes"}

使用pairs可以遍历这个表, 会忽略value=nil的元素.

> tbl = {a="nihao", b=nil, c="hello", d="yes"}
> for k,v in pairs(tbl) do
>>  print(k,v)
>> end
a       nihao
d       yes
c       hello

其实pairs是调用了next(_s, _var)函数, 所以我们知道generic for语法的话, 可以直接使用next来写for循环.

> for k,v in next, tbl do
>>   print(k,v)
>> end
a       nihao
d       yes
c       hello

直接调用next的效果

> =next(tbl,nil)
a       nihao
> return next(tbl,"a")
d       yes
> return next(tbl,"d")
c       hello
> return next(tbl,"c")
nil

pairs原型

function pairs(t)
  return next, t, nil
end

3. list指链表.

> a = {"hello", next=nil}  -- 链表的头
> a = {"nihao", next=a}  -- next指向头
> a = {"yes", next=a}  -- next指向上层
> a = {"ok", next=a}  -- next指向上层 

打印链表的值.

> print(a[1])
ok
> print(a.next[1])
yes
> print(a.next.next[1])
nihao
> print(a.next.next.next[1])
hello

生成一个链表和输出链表的值的例子

> list = nil
>     for line in io.lines() do
>>       list = {next=list, value=line}
>>     end
a
b
c
d
e
^D
>  l = list
>     while l do
>>       print(l.value)
>>       l = l.next
>>     end
e
d
c
b
a

链表的generic for循环函数用法 .

iterator函数, 函数中不保存state值. 所以也称为stateless iterator

> function getnext(list, node)
>>   if not node then
>>     return list
>>   else
>>     return node.next
>>   end
>> end

factory 函数

> function traverse(list)
>>   return getnext, list, nil
>> end

使用io.lines生成链表

> list = nil
> for line in io.lines() do
>>   list = {val = line, next = list}
>> end
hello
yes
digoal
hehe
^D

使用factory函数循环

> for node in traverse(list) do
>>   print (node.val)
>> end
hehe
digoal
yes
hello

直接使用stateless iterator函数和state值循环

> for node in getnext,list do
  print (node.val)
end
hehe
digoal
yes
hello

4. 

table.pack 和table.unpack

table.pack把多个值打包成一个序列表.
> a = table.pack("a","b","c","nil")
> for i,v in ipairs(a) do
>>   print (i,v)
>> end
1       a
2       b
3       c
4       nil
table.unpack把序列表解散成多值返回.
> x,y,z = table.unpack(a)
> print(x,y,z)
a       b       c
> x,y,z = table.unpack({a=1,b=2,c=3})  -- unpack不处理非序列表元素.
> print(x,y,z)
nil     nil     nil
> x,y,z = table.unpack({a=1,b=2,c=3,"h","j","k"})  -- 只解包序列部分
> print(x,y,z)
h       j       k
时间: 2024-09-16 02:00:35

Lua talbe's pairs & ipairs & traverse loop, table.pack and table.unpack的相关文章

CLR探索系列-GC中的Card table和Brick Table(垃圾回收系列)

在CLR的垃圾回收子系统中,Card Table和Brick Table是两个比较有意思的表. 在GC的过程中,一个Heap在运行了一段时间以后,已经分配的空间就会越来越大.在进行了一次局部代或者是完全的垃圾回收以后,就会涉及到一个GC堆的类似碎片整理的概念.整理优化一次GC Heap.同时,这种机制保证了譬如一个IIS Server在长时间的运行过程中的稳定性并且优化了其内存管理. 这样的好处是显而易见的,但是采用这种解决方案带来的问题也很容易想到:譬如一个存在于GC Heap里面的"Smal

js中怎么循环输出两个table两个table的输出

问题描述 js中怎么循环输出两个table两个table的输出 function searchSpecific(headCount){ //查询每个月具体扣税 $.ajax({ type: 'POST', url: 'personVoid_searchPersons.action', data: { headCount: headCount }, dataType: 'JSON', success: function(data){ var today = new Date(); var year

0520alter table xxx disable table lock

[20160520]alter table xxx disable table lock.txt --如果你想别人不能drop,truncate表,可以简单取消表锁.例子如下: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING         VERSION        BANNER ------------------- -------------- ------------------------------------------------------

REPAIR TABLE和OPTIMIZE TABLE优化表和修复表

REPAIR TABLE `table_name` 修复表OPTIMIZE TABLE `table_name` 优化表 REPAIR TABLE 用于修复被破坏的表.OPTIMIZE TABLE 用于回收闲置的数据库空间,当表上的数据行被删除时,所占据的磁盘空间并没有立即被回收,使用了OPTIMIZE TABLE命令后这些空间将被回收,并且对磁盘上的数据行进行重排(注意:是磁盘上,而非数据库).多数时间并不需要运行OPTIMIZE TABLE,只需在批量删除数据行之后,或定期(每周一次或每月一

javascript 实现简单的table排序及table操作练习_javascript技巧

在这个列子中,练习了table的操作,主要有:tBodies.rows.cells,还有有关数组的排序方法:sort 先上代码: 复制代码 代码如下: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>table排序</title> </head> <body> <table id="tableTest&q

mysql下优化表和修复表命令使用说明(REPAIR TABLE和OPTIMIZE TABLE)_Mysql

复制代码 代码如下: REPAIR TABLE `table_name` 修复表 OPTIMIZE TABLE `table_name` 优化表 REPAIR TABLE 用于修复被破坏的表. OPTIMIZE TABLE 用于回收闲置的数据库空间,当表上的数据行被删除时,所占据的磁盘空间并没有立即被回收,使用了OPTIMIZE TABLE命令后这些空间将被回收,并且对磁盘上的数据行进行重排(注意:是磁盘上,而非数据库). 多数时间并不需要运行OPTIMIZE TABLE,只需在批量删除数据行之

Lua中table的遍历详解_Lua

当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: 复制代码 代码如下: for key, value in pairs(tbtest) do      XXX  end   for key, value in ipairs(tbtest) do      XXX  end   for i=1, #(tbtest) do      XXX  end   for i=1, table.maxn(tbtest)

Lua table类型学习笔记_Lua

关系表类型,这是一个很强大的类型.我们可以把这个类型看作是一个数组.只是 C语言的数组,只能用正整数来作索引: 在Lua中,你可以用任意类型的值来作数组的索引,但这个值不能是 nil.同样,在C语言中,数组的内容只允许一种类型:在 Lua中,你也可以用任意类型的值来作数组的内容,nil也可以. 基本介绍 注意三点: 第一,所有元素之间,总是用逗号 "," 隔开: 第二,所有索引值都需要用 "["和"]" 括起来:如果是字符串,还可以去掉引号和中括

Lua中table库函数方法介绍_Lua

一部分的table函数只对其数组部分产生影响, 而另一部分则对整个table均产生影响. 下面会分开说明. table.concat(table, sep,  start, end) concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开.除了table外, 其他的参数都不是必须的, 分隔符的默认值是空字符, start的默认值是1, end的默认