lua table引用问题
admin
2023-03-18 03:41:12
0


一,基础

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

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的问题

代码如下:

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日志中的结果:

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"]。



相关内容

热门资讯

ICC逮捕令致内塔尼亚胡出行受... 【环球网报道】据以色列《新消息报》网站26日报道,由于国际刑事法院(ICC)2024年就以色列在巴勒...
“罗永浩怒斥电视机厂商”戳中了... 7月25日晚,罗永浩发文怒斥当下电视机的产品设计。据都市快报报道,罗永浩表示,他为家中老人换了两次电...
各地各部门坚持人民至上筑牢防汛... 新华社北京7月25日电 题:风雨同舟映初心——各地各部门坚持人民至上筑牢防汛抗洪坚实堤坝新华社记者当...
法院回应LV起诉地产开发商 7月26日,厦门市湖里区人民法院发布情况通报,网传案情“路易威登公司起诉地产开发商,因楼盘外立面四叶...
携程的问题不仅在于垄断,更在于... 国内平台科技企业一般都是通过向B端收费、抽佣获利,尽量给消费者创造一个比较清爽的使用环境。携程算是最...
海信电视用遥控器关闭后打不开 原因可能是遥控器的电池没有装好或者是没电了,需要重新安装一下电池或者更换新的电池试一试;原因可能是电...
电视机突然没电源打不开了 有可能是电视开关的电源线断了;可能是电视在使用时短路;可能是电源插头插座松动;可能是电视内部零件接触...
电热水器下面那个小龙头漏水是怎... 电热水器下面那个小龙头漏水是怎么回事?1、因为安全阀发生了故障或者是已经被损坏了,就会有漏水的现象;...
回答下电脑桌面一片空白怎么恢复 电脑桌面上如果是一片空白,那说明您的电脑图标被隐藏了,想要恢复就要按照如下的三个步骤去操作才行。 第...
澳总理要找特朗普“理论”关税:... 当地时间7月26日,澳大利亚总理阿尔巴尼斯表示,他将直接向美国总统特朗普提出抗议,反对美国新近宣布的...