lua table引用问题

简介:

一,基础

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,如需转载请自行联系原作者
目录
相关文章
|
8月前
|
存储 Java C语言
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】
60 0
|
XML Java 数据格式
【Lua基础 第2章】lua遍历table的方式、运算符、math库、字符串操作方法
lua遍历table的方式、运算符、math库、字符串操作方法
609 0
【Lua基础 第2章】lua遍历table的方式、运算符、math库、字符串操作方法
|
C# 数据库
Lua Table转C# Dictionary
Lua Table转C# Dictionary
99 0
|
XML Java 数据格式
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
130 0
【Lua基础 第4章】Lua的流程控制、#的作用、table的创建方式、table表常用方法、函数、多返回值、可变长参数
|
数据采集 存储 JavaScript
Lua 语法 Table 与模块|学习笔记
快速学习 Lua 语法 Table 与模块
166 0
Lua 语法 Table 与模块|学习笔记
|
Java 索引
Lua语言——table(表)
Lua语言——table(表)
144 0
Lua Table表实现字典
Lua Table表实现字典
704 0
Lua Table表实现字典