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

目录
相关文章
|
存储 NoSQL Redis
Redis的Lua脚本有什么作用?
Redis Lua脚本用于减少网络开销、实现原子操作及扩展指令集。它能合并操作降低网络延迟,保证原子性,替代不支持回滚的事务。通过脚本,代码复用率提高,且可自定义指令,如实现分布式锁,增强Redis功能和灵活性。
611 1
|
缓存 NoSQL 搜索推荐
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
本文介绍了如何通过Lua脚本在Redis中实现分布式锁的原子性操作,避免并发问题。首先讲解了Lua脚本的基本概念及其在Redis中的使用方法,包括通过`eval`指令执行Lua脚本和通过`script load`指令缓存脚本。接着详细展示了如何用Lua脚本实现加锁、解锁及可重入锁的功能,确保同一线程可以多次获取锁而不发生死锁。最后,通过代码示例演示了如何在实际业务中调用这些Lua脚本,确保锁操作的原子性和安全性。
710 6
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
735 0
|
NoSQL Redis 数据库
Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
通过本文的介绍,我们详细讲解了 Lua 脚本在 Redis 中的作用、`eval` 命令的使用方法以及 `redis.call` 和 `redis.pcall` 的区别和用法。通过合理使用 Lua 脚本,可以实现复杂的业务逻辑,确保操作的原子性,并减少网络开销,从而提高系统的性能和可靠性。
853 13
|
监控 安全
公司用什么软件监控电脑:Lua 脚本在监控软件扩展功能的应用
在企业环境中,电脑监控软件对保障信息安全、提升效率至关重要。Lua 脚本在此类软件中用于扩展功能,如收集系统信息、监控软件使用时长及文件操作,向指定服务器发送数据,支持企业管理和运营。
240 6
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
219 2
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
JSON 监控 数据格式
使用Lua代码扩展上网行为管理软件的脚本功能
本文介绍了如何使用Lua脚本增强上网行为管理,包括过滤URL、记录用户访问日志、控制带宽和自动提交监控数据到网站。Lua是一种轻量级语言,适合编写扩展脚本。文中提供多个示例代码,如URL过滤器、用户活动日志记录器和带宽控制器,帮助用户根据需求定制网络管理功能。通过这些示例,用户可以快速掌握Lua在上网行为管理中的应用。
380 4