博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lua table引用问题
阅读量:6006 次
发布时间:2019-06-20

本文共 3838 字,大约阅读时间需要 12 分钟。

一,基础

1,在lua中,table只是传递引用(即两个变量都指向同一片内存空间),所以不能用简单的 "=" 来copy两个表,并试图修改一个表中的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
tb = {}
tb.a = 11
tb.b = 22
tb_ref = tb
function p(tip)
  
print(
"--------------------------"  
.. tip)
  
print(
"tb.a = " 
.. tb.a .. 
"    " 
.. 
"tb.b = " 
.. tb.b)
  
print(
"tb_ref.a = " 
.. tb_ref.a .. 
"    " 
.. 
"tb_ref.b" 
.. tb_ref.b)
end
p(
"原始"
)
tb_ref.a = 33
p(
"修改了引用的a = 33,原来的a也变了"
)
tb.b = 44
p(
"修改了原始的b = 44,引用的b也变了"
)
print(
"----------------------非表test"
)
a = 1
c = a
c = 3
print(
"a = " 
.. a)
print(
"c = " 
.. c) 
打印结果:
--------------------------原始
tb.a = 11    tb.b = 22
tb_ref.a = 11    tb_ref.b22
--------------------------修改了引用的a = 33,原来的a也变了
tb.a = 33    tb.b = 22
tb_ref.a = 33    tb_ref.b22
--------------------------修改了原始的b = 44,引用的b也变了
tb.a = 33    tb.b = 44
tb_ref.a = 33    tb_ref.b44
----------------------非表test
a = 1
c = 3

结果:  

当改变表的一个值以后,它的引用的值也发生了变化;

对于非表的一般常数来说,它的赋值不存在引用的问题;

2,table存储

1)table里保存数据,数据可以是任何类型,包括function。 

2)table里也可以保存table 

3)key代表数据存储的位置

4)value就是用特定的key存储的数据 

二,记录遇见的一个关于table的问题

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
local cjson = require(
"cjson"
)
local t = {[
"GET"
] = {[
"/a"
] = 
"f"
}}
 
function hehe(node)
   
node[
"TOKEN"
] = node[
"TOKEN"
] or {}
   
ngx.
log
(ngx.ERR, 
"0"
, cjson.encode(t[
"GET"
]))
   
ngx.
log
(ngx.ERR, 
"0"
, cjson.encode(node))
   
ngx.
log
(ngx.ERR, 
"0"
, tostring(node))
 
   
node = node[
"TOKEN"
]
   
ngx.
log
(ngx.ERR, 
"1"
, cjson.encode(t[
"GET"
]))
   
ngx.
log
(ngx.ERR, 
"1"
, cjson.encode(node))
   
ngx.
log
(ngx.ERR, 
"1"
, tostring(node))
 
   
node[
"TOKEN"
] = 
"123"
   
ngx.
log
(ngx.ERR, 
"2"
, cjson.encode(t[
"GET"
]))
   
ngx.
log
(ngx.ERR, 
"2"
, cjson.encode(node))
   
ngx.
log
(ngx.ERR, 
"2"
, tostring(node))
end
 
hehe(t[
"GET"
])
ngx.say(
"ok"
)

nginx日志中的结果:

1
2
3
4
5
6
7
8
9
2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):8: hehe(): 0{
"\/a"
:
"f"
,
"TOKEN"
:{}}, client: 127.0.0.1, server: , request: 
"GET / HTTP/1.1"
, host: 
"127.0.0.1:8888"
2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):9: hehe(): 0{
"\/a"
:
"f"
,
"TOKEN"
:{}}, client: 127.0.0.1, server: , request: 
"GET / HTTP/1.1"
, host: 
"127.0.0.1:8888"
2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):10: hehe(): 0table: 0x41dfca60, client: 127.0.0.1, server: , request: 
"GET / HTTP/1.1"
, host: 
"127.0.0.1:8888"
2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):13: hehe(): 1{
"\/a"
:
"f"
,
"TOKEN"
:{}}, client: 127.0.0.1, server: , request: 
"GET / HTTP/1.1"
, host: 
"127.0.0.1:8888"
2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):14: hehe(): 1{}, client: 127.0.0.1, server: , request: 
"GET / HTTP/1.1"
, host: 
"127.0.0.1:8888"
2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):15: hehe(): 1table: 0x41e011e0, client: 127.0.0.1, server: , request: 
"GET / HTTP/1.1"
, host: 
"127.0.0.1:8888"
2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):18: hehe(): 2{
"\/a"
:
"f"
,
"TOKEN"
:{
"TOKEN"
:
"123"
}}, client: 127.0.0.1, server: , request: 
"GET / HTTP/1.1"
, host: 
"127.0.0.1:8888"
2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):19: hehe(): 2{
"TOKEN"
:
"123"
}, client: 127.0.0.1, server: , request: 
"GET / HTTP/1.1"
, host: 
"127.0.0.1:8888"
2017/07/10 15:28:16 [error] 20400#0: *749 [lua] access_by_lua(nginx.conf:138):20: hehe(): 2table: 0x41e011e0, client: 127.0.0.1, server: , request: 
"GET / HTTP/1.1"
, host: 
"127.0.0.1:8888"

结果分析:

1,lua中table相关操作包括做为function的参数都是引用操作,在function中对table node的key,value的相关操作都是对原table t的操作;

2,node = node["TOKEN"] 这一步操作相当于把node的内存地址指向了node["TOKEN"]的内存地址(即t["GET"]["TOKEN"]的内存地址),故之后对node的操作,都会影响到t["GET"]["TOKEN"]。

本文转自 leejia1989 51CTO博客,原文链接:http://blog.51cto.com/leejia/1945378,如需转载请自行联系原作者
你可能感兴趣的文章
聚类(三)FUZZY C-MEANS 模糊c-均值聚类算法——本质和逻辑回归类似啊
查看>>
像屎一样的 Spring Boot入门,总算有反应了
查看>>
Device Tree碎碎念
查看>>
STM32F103ZET6 之 ADC+TIM+DMA+USART 综合实验
查看>>
oracle 锁系列
查看>>
HBuilder开发App教程06-首页
查看>>
深入理解JVM:HotSpot虚拟机对象探秘
查看>>
virtualbox测试k8s要注意的情况
查看>>
mac系统下为emacs设置中文字体,解决乱码问题
查看>>
K8s的内部Pod之间都不通,搞了快两天
查看>>
android RecycleView复杂多条目的布局
查看>>
AAC帧格式及编码介绍
查看>>
一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)
查看>>
2014年半年结
查看>>
Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)...
查看>>
ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务|转|
查看>>
ulimit用法简介
查看>>
tomcat 配置首页
查看>>
PHP工厂模式的好处
查看>>
半年拾遗
查看>>